【问题标题】:Create a JSON from a servers response using JavaScript使用 JavaScript 从服务器响应创建 JSON
【发布时间】:2018-08-28 09:48:45
【问题描述】:

我从远程服务器收到此响应。

A 有 100 件产品\n 带了:\n ID/234 带来了 8 件产品\n ID/212 带来了 72 件产品\n 没有带来\n\n B 有 0 件产品\n 带来了\n 没有带来了\n

当我在终端上执行我的节点 js 脚本时,此响应显示为一个表格,如下面的屏幕截图所示。

我希望这个输出为 JSON。

这是我的代码。

function(err, res) {
        product=res.content; //store the response in variable
        var prodArr = [];
        var obj = product.split('\n'); //split the response at new lines
    for(var i= 1; i<obj.length; i=i+1)
    {
                prodArr.push({
                    data : obj[i]
                 });

            }
        console.log(prodArr);
    })
}

这里是我执行上述脚本时得到的 JSON。

{ data:'A has 100 products' },
{ data: 'Brought: '},
{ data:'ID/234 has brought 8 products ' },
{ data:'ID/212 has brought 72 products ' },
{ data: 'Not Brought' },
{ data:'B has 0 products' },
{ data: 'Brought: '},
{ data: 'Not Brought '},

但我想要 JSON,它应该如下所示:

{
"data":{
  "title": "A has 100 products",
"Brought": {
"1" : "ID/234 has brought 8 products",
"2" : "ID/212 has brought 72 products"
},
"Not Brought" : {
    }
 }
},

{
"data":{
  "title": "B has 0 products",
"Brought": {
},
"Not Brought" : {
    }
 }
}

我该怎么做?

【问题讨论】:

  • 嗨!请通读help center,特别是How do I ask a good question? 您显示的代码不会做任何事情来创建您所说的您想要的输出。在内存中构建对象结构,然后使用JSON.stringify 为其创建 JSON。你最好的选择是做你的研究,search 以获取有关 SO 的相关主题,然后试一试。 如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您遇到的问题。人们会很乐意提供帮助。
  • 当您点击创建此帖子时,按钮显示“”。但“我想要”或“我需要”不是问题。 “我如何”通常过于宽泛和模糊,除非它是非常非常简单的东西。我们将帮助您修复错误,而不仅仅是完全为您完成工作。你做了什么研究?你试过什么代码?你面临什么问题?请阅读stackoverflow.com/help/how-to-ask 以获取有关如何提出有用问题的进一步指导。
  • 基本上,尽管您需要在盲目地将每一行添加到数组之前开始检查每一行的内容,并使用它来决定您在构建对象时所处的步骤,然后采取相应的行动。试着给自己写一些简单的规则,告诉你(作为一个人)如何手动将数据处理成你想要的结构——就像你在向一个你永远不会当面交谈的人描述它一样(即彻底且没有歧义) ,所以他们不必问你)。这为您提供了您的要求和流程。之后,尝试将其转换为 JavaScript 代码。

标签: javascript arrays json node.js


【解决方案1】:

您需要使用正则表达式来确定标题元素的位置以及带入和未带入的项目,因为解决方案是完全具体的。

var input = "A has 100 products\n   Brought: \n      ID/234 has brought 8 products\n      ID/212 has brought 72 products\n   Not Brought\n\n B has 0 products\n   Brought\n   Not Brought\n";
var splitInput = input.split('\n'); // split with newline
var formattedInput = splitInput.map(slice => slice.trim()); // trim extra spaces
var titleIndices = [], broughtIndices = [], notBroughtIndices = []; // figure out necessary indices in string
for(var i = 0; i < formattedInput.length; i++) {
 if(/\w+ has \d+ products/.test(formattedInput[i])){
    titleIndices.push(i);
  }
 if(/^Brought\:?/.test(formattedInput[i])) {
  broughtIndices.push(i);
 }
 if(/^Not Brought\:?/.test(formattedInput[i])) {
  notBroughtIndices.push(i);
 }
}
const output = [];
for(var i = 0; i < titleIndices.length; i++) {
  const broughtLength = notBroughtIndices[i] - broughtIndices[i] - 1;
  let brought = {};
  for(var j=0; j < broughtLength; j++) {
    const broughtItem = formattedInput[broughtIndices[i]+1+j];
    if(broughtItem) {
     brought[j+1] = broughtItem;
    }
  }
  const notBroughtLength = (titleIndices[i+1] || notBroughtIndices[i] ) - notBroughtIndices[i] - 1;
  let notBrought = {};
  for(var j=0; j < notBroughtLength; j++) {
    const notBroughtItem = formattedInput[notBroughtIndices[i]+1+j]
    if (notBroughtItem) {
    notBrought[j+1] = notBroughtItem;
  }
  }
 output.push({
  data: {
    title: formattedInput[titleIndices[i]],
    Brought: brought,
    "Not Brought": notBrought,
  }
 });
}
console.log(JSON.stringify(output))

【讨论】:

  • 非常感谢。我使用了您代码中的逻辑,它对我有用
  • 你能帮我this
【解决方案2】:

var InputValue=['A has 100 Product','Brought','ID/1251 brought 8 Product','ID/1252 brought 4 Product','Not Brought','B has 100 Product','Brougth','ID/1222 brought 8 Product','ID/1333 brought 2 Product','Not Brought']
var prodArr={};
var finalResult=[];
var BroughtArr=[]
let i=0;
for(i=0;i<InputValue.length;i++){
    if(i==0){
         prodArr['Title']=InputValue[0];
         i++;
    }
    if(InputValue[i]==='Brought'){
       ++i;
       for(let j=i;j<InputValue.length;j++){
          if(InputValue[j]!='Not Brought'){
           BroughtArr.push(InputValue[j]);
         }else{
           prodArr['Brought']=BroughtArr
           finalResult.push(prodArr);
           BroughtArr=[]
           prodArr={}
           if(i<InputValue.length)
           prodArr['Title']=InputValue[++j];
           i=++j;
         } 
       }
     }
}
console.log(finalResult)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多