Node.js 中的 JSON 数组

Posted

技术标签:

【中文标题】Node.js 中的 JSON 数组【英文标题】:JSON array in Node.js 【发布时间】:2012-08-08 07:59:02 【问题描述】:

过去一周我一直在努力解决这个问题,但我尝试的一切似乎都不起作用。

我必须在我的本地机器上创建一个响应请求的 Web 服务。客户端(不是我写的)将一次向我的服务询问一个问题,我的服务器应该给出适当的答案。

所以我要做的最后一件事是:

当在位置 '/sort' 使用参数 'theArray' 发出 POST 请求时,排序数组删除所有非字符串值并将结果值作为JSON返回。

theArray 参数将是一个字符串化的 JSON 数组

经过反复试验,我发现提供的参数是:

"theArray":"[[],\"d\",\"B\",,\"b\",12,\"A\",\"c\"]"

我尝试了许多不同的方法来尝试使其正常工作。但我能得到的最接近的东西是它只返回相同的东西或什么都不返回。这是我用来获得这些结果的代码:

case '/sort':
        if (req.method == 'POST') 
            res.writeHead(200,
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            );
            var fullArr = "";
                req.on('data', function(chunk) 
                    fullArr += chunk;
                    );
                req.on('end', function() 
                            var query = qs.parse(fullArr);
                            var strin = qs.stringify(query.theArray)
                            var jArr = JSON.parse(fullArr);
                    console.log(jArr); // Returns undefided:1 
                            var par = query.theArray;
                    console.log(par); // returns [[],"d","B",,"b",12,"A","c"]

                                function censor(key) 
                                    if (typeof key == "string") 
                                            return key;
                                         
                                        return undefined;
                                        
                        var jsonString = JSON.stringify(par, censor);
                   console.log(jsonString); // returns ""
                );         
                    res.end();


        ;

break;

只是为了澄清我需要它返回的是["d","B","b","A","c"]

因此,如果有人可以帮助我解决这个问题,并且如果可能的话,用一些书面代码做出回应,这些代码的设置方式已经可以与我设置代码的方式一起使用,那就太好了!谢谢

【问题讨论】:

那么,你的对象被正确解析了,你只需要获取字符串元素吗?这更像是一个算法问题。我说的对吗? 我会说是的。我只需要返回数组中的字符串。所以需要取出 []、 和 12 以便我可以返回字符串 好的。看看我的回答。我会尽量按照你的方式去做。 【参考方案1】:

编辑:试试这个:

var query = "theArray":"[[],\"d\",\"B\",,\"b\",12,\"A\",\"c\"]";
var par = JSON.parse(query.theArray);
var stringArray = [];
for ( var i = 0; i < par.length; i++ ) 
    if ( typeof par[i] == "string" ) 
        stringArray.push(par[i]);
    

var jsonString = JSON.stringify( stringArray );
console.log(jsonString);

附:我没注意。您的数组实际上是一个字符串。安德烈,谢谢你的提示。

【讨论】:

在他的例子中看起来 par 是 json 作为字符串 试试console.log(typeof(par)) 先解析代表数组的字符串 console.log(typeof(par)) 返回字符串 尝试以var formdata = 'theArray"%3A"%5B%5B%5D%2C%5C"d%5C"%2C%5C"B%5C"%2C%7B%7D%2C%5C"b%5C"%2C12%2C%5C"A%5C"%2C%5C"c%5C"%5D"' 开始您的示例:)【参考方案2】:

JSON.stringifyreplacer 参数不像您使用它那样工作;查看the documentation on MDN。

您可以使用Array.prototype.filter 过滤掉您不想要的元素:

var arr = [[],"d","B",,"b",12,"A","c"];
arr = arr.filter(function(v)  return typeof v == 'string'; );
arr // => ["d", "B", "b", "A", "c"]

【讨论】:

【参考方案3】:

编辑:单行(在 repl 中尝试!)

JSON.stringify(JSON.parse(require('querystring').parse('theArray=%5B%5B%5D%2C"d"%2C"B"%2C%7B%7D%2C"b"%2C12%2C"A"%2C"c"%5D').theArray).filter(function(el) return typeof(el) == 'string'));

要粘贴到您的服务器的代码:

case '/sort':
        if (req.method == 'POST') 
            buff = '';
            req.on('data', function(chunk)  buff += chunk.toString() );
            res.on('end', function() 
              var inputJsonAsString = qs.parse(fullArr).theArray;
              // fullArr is x-www-form-urlencoded string and NOT a valid json (thus undefined returned from JSON.parse)
              var inputJson = JSON.parse(inputJsonAsString);
              var stringsArr = inputJson.filter(function(el) return typeof(el) == 'string');
              res.writeHead(200,
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
              );
              res.end(JSON.stringify(stringsArr));
        ;
break;

【讨论】:

以上是关于Node.js 中的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node.js 解析不包含 JSON 对象的 JSON 数组

如何解决 Node.js 中的“请求过多”错误?

如何从 json 响应中连接来自不同对象数组的值? Node.js、Discord.js

如何使用 Node.js 将 JSON 数组转换为 CSV?

如何在node.js中将json数组数据插入mysql?

在 Node.js 中响应 JSON 对象(将对象/数组转换为 JSON 字符串)