Javascript 如何将数据从字符串类型格式化为有效的JSON对象

Javascript 如何将数据从字符串类型格式化为有效的JSON对象,javascript,json,Javascript,Json,我得到了一个字符串类型的数据,如下所示 { "Description": "some descriptions", "Customers": { "Customer": { "Name": "John Smith", "Phone": "123-456-7890" }, "Customer": { "Name": "Chris Lee",

我得到了一个字符串类型的数据,如下所示

{
  "Description": "some descriptions",
  "Customers": {
        "Customer": {
              "Name": "John Smith",
              "Phone": "123-456-7890"
        },
        "Customer": {
              "Name": "Chris Lee",
              "Phone": "555-666-7890"
        }
  },
  "Addresses": {
        "Address": {
              "City": "New York"
        }
  }
}
我在将其转换为如下所示的有效JSON对象时遇到问题

{
      "Description": "some descriptions",
      "Customers": [
            {
                  "Name": "John Smith",
                  "Phone": "123-456-7890"
            },
            {
                  "Name": "Chris Lee",
                  "Phone": "555-666-7890"
            }
      ],
      "Addresses": [
            {
              "City": "New York"
            }
      ]
}
到目前为止,我尝试使用JSON.parse,但没有成功。结果看起来像

{
      "Description": "some descriptions",
      "Customers": {
            "Customer": {
                  "Name": "John Smith",
                  "Phone": "123-456-7890"
            }
      },
      "Addresses": {
            "Address": {
                  "City": "New York"
            }
      }
}
你可以看到,我丢失了一个客户记录

我根本无法更改数据的内容。如果可以的话,我会把客户做成一个阵列,这应该可以解决问题,但我做不到

我还考虑过使用javascript正则表达式来实现这一点,运气不好


任何想法都会有帮助,谢谢。

假设在源代码处修复此问题的所有其他途径都失败了,我建议计算客户和地址的密钥,然后在将json转换为对象后对其进行任何其他操作

常量str=`{ 描述:一些描述, 顾客:{ 客户:{ 姓名:约翰·史密斯, 电话:123-456-7890 }, 客户:{ 姓名:克里斯·李, 电话:555-666-7890 } }, 地址:{ 地址:{ 城市:纽约 } } }`; 设cCount=0; 设a计=0; const out=str.replace/Customer | Address/g,功能a{ 如果a==‘客户’{ 返回`Customer${cCount++}`; }否则{ 返回`Address${aCount++}`; } }; 控制台。注销; .作为控制台包装{ 最大高度:100%!重要
} 如果无法修复源数据,下面是一个将子元素转换为数组的函数:

function makeArrays(json, pairs) {
    for (i in pairs) {
        // Turn container into array
        re = new RegExp(pairs[i][0]+'": {');
        json = json.replace(re, pairs[i][0]+'": [');

        // Remove label from child element
        re = new RegExp('"'+pairs[i][1]+'": ', 'g');
        json = json.replace(re, '');
    }
    // Close array
    json = json.replace(/} }/g, '} ]');

    return json;
}
此函数接受两个参数。第一个是原始JSON字符串,第二个是容器和子元素标签对

调用如下所示:

makeArrays(jsonInput, [['Customers', 'Customer'],['Addresses', 'Address']])
输出将是:

{ "Description": "some descriptions", "Customers": [ { "Name": "John Smith", "Phone": "123-456-7890" }, { "Name": "Chris Lee", "Phone": "555-666-7890" } ], "Addresses": [ { "City": "New York" } ] }

这是有效的JSON。

可能会失败,因为源JSON包含客户:{cust1,cust2},而不是客户:[cust1,cust2]。如果要在结果中使用数组,则需要在源代码中使用数组。请修复源代码,而不是症状。@str OP相当明确地说,他不能使用regexp与有效的json字符串交互。将它转换为一个对象,对其进行操作,然后如果您确实需要它作为json字符串返回,请将该对象字符串化。@zfrisch我明白了。但是数据交换格式已经被指定为不存在这样的情况。无效的JSON根本不是JSON。如果源代码生成了这样的垃圾,你怎么知道它不会生成更多的垃圾来破坏你的修复?如果您不能更改产品,则更换生产商。