【问题标题】:Parsing JSON nested arrays with JS用 JS 解析 JSON 嵌套数组
【发布时间】:2020-01-28 12:23:53
【问题描述】:

我在这里用类似的 JSON 讨论了各种主题,但从来没有相同,而且我仍在努力循环遍历数组的元素。

我有以下 JSON:

     {
     "person": 
     [
        {
            "id": "xyz",
            "attributes": 
            [
            {"attribute_name1": "value1"},
            {"attribute_name2": "value2"}
            ]
        },
        {
            "id": "abc1",
            "attributes": 
            [
            {"attribute_name1": "value3"},
            {"attribute_name2": "value4"},
{"attribute_name3": "value77"}
            ]
        }
    ]
}

JSON 预先作为字符串传递。 然后我试图列出所有“人”以及他们的 ID 和属性列表:

var data = '{"person":[ { "id": "xyz","attributes": [{"attribute_name1": "value1"},{"attribute_name2": "value2"}]},{"id": "abc1","attributes": [{"attribute_name1": "value3"},{"attribute_name2": "value4"},{"attribute_name3": "value77"}]}]}';

var json, i, j;
var json = data.toString();

json = JSON.parse(json);

for (i in json.person) {
  for (j in json.person[i].attributes) {
    var attribute_name = Object.keys(json.person[i].attributes[j]); // here because I won't know what are the actual names of those attributes
    console.log("Person's ID: " +json.person[i].id + " /// Person's Attribute name: " +attribute_name + " /// Person's Value: " +json.person[i].attributes[j]['attribute_name']);
    console.log("Person's Value: " +json.person[i].attributes[j]['attribute_name']); // this gives undefined
    console.log("Person's Value: " +json.person[i].attributes[j].attribute_name);    // this also gives undefined
  }
}

如果有任何帮助,我很乐意更改 JSON 的结构。如果它们的名称不是“固定的”,有关如何获取这些属性名称的值的任何提示?

【问题讨论】:

  • 你能解释一下你真正想要什么吗?
  • 如前所述,想逐行列出所有人员及其 ID 和属性

标签: javascript json


【解决方案1】:

也许这会有所帮助。更改 JSON 结构

var person = [{id:1, name: 'John'},{id:2, name: 'Mary'}];
var attributes = [
 {person_id:1, name: 'attr_name', value: 'val1'},
  {person_id:2, name: 'attr_name2', value: 'val2'}
  ];
 
 // variant 1
 for (let attr of attributes) {
   if (attr.person_id === targetPersonId) { ... }
 }
 
 // variant 2
attributes.map(el => el.person_id === targetPersonId).forEach(... do something)

【讨论】:

  • 谢谢,但是我不能真正拆分它,它必须是一串包含 JSON 代码的文本
【解决方案2】:

您可以将此 sn-p 与现有的 JSON 结构一起使用。

const data = '{"person":[ { "id": "xyz","attributes": [{"attribute_name1": "value1"},{"attribute_name2": "value2"}]},{"id": "abc1","attributes": [{"attribute_name1": "value3"},{"attribute_name2": "value4"},{"attribute_name3": "value77"}]}]}';

const json = JSON.parse(data);

json.person.forEach((person) => {
  person.attributes.forEach((attribute) => {
    const properties = Object.keys(attribute);
    console.log(`Person's ID:`, person.id);
    properties.forEach((prop) => {
      console.log(`${prop} ${attribute[prop]}`);
    });
  });
});

【讨论】:

  • 谢谢,但是我很难理解这里的简短语法并且不确定 ${prop} 位是什么
  • 这些是字符串文字,您可以在here 上阅读更多关于它们的信息。我们使用forEach 循环遍历propertiesprop 是当前元素。
【解决方案3】:

json.person[i].attributes[j]['attribute_name'] 中删除单引号,即json.person[i].attributes[j][attribute_name]

var data = '{"person":[ { "id": "xyz","attributes": [{"attribute_name1": "value1"},{"attribute_name2": "value2"}]},{"id": "abc1","attributes": [{"attribute_name1": "value3"},{"attribute_name2": "value4"},{"attribute_name3": "value77"}]}]}';
var json, i, j;

json = JSON.parse(data);
for (i in json.person) {
  for (j in json.person[i].attributes) {
    var attribute_name = Object.keys(json.person[i].attributes[j]);
    console.log("Person's ID: " +json.person[i].id + " /// Person's Attribute name: " + attribute_name + " /// Person's Value: " +json.person[i].attributes[j][attribute_name]);
    console.log("Person's Value: " +json.person[i].attributes[j][attribute_name]);
  }
}

【讨论】:

  • 谢谢,试过了,但出现“无效的 XML 名称”错误,考虑到这与 XML 无关,这很奇怪
  • @Valverde 你能解释一下吗?
  • 编译代码时会抛出“无效的 XML 名称”错误
【解决方案4】:

如果您想从 json 中获取具有名称/值的对象,您可以尝试使用类似的方法。

var object = {
     "person": 
     [
        {
            "id": "xyz",
            "attributes": 
            [
            {"attribute_name1": "value1"},
            {"attribute_name2": "value2"}
            ]
        },
        {
            "id": "abc1",
            "attributes": 
            [
            {"attribute_name1": "value3"},
            {"attribute_name2": "value4"},
            {"attribute_name3": "value77"}
            ]
        }
    ]
}



var someobj = {};

function generate(obj) {
    Object.keys(obj).forEach(key => {
        if (key !== 'key' && key !== 'value') {
            obj[key].forEach(element => {
                someobj[element.id] = element.attributes;
                return someobj;
            });
        }
    })
}

【讨论】:

    【解决方案5】:

    <script>
        var data = {
            person: [{
                id: "xyz", attributes: [{ attribute_name1: "value1" },
                { attribute_name2: "value2" }]
            },
            {
                id: "abc1", attributes: [{ attribute_name1: "value3" },
                { attribute_name2: "value4" }, { attribute_name3: "value77" }]
            }]
        };
    
        var json, i, j;
        //var json = data.toString();
    
        //json = JSON.parse(json);
    
        for (i in data.person) {
            console.log("Person's ID: " + data.person[i].id);
            for (j in data.person[i].attributes) {
                var attribute_name = Object.keys(data.person[i].attributes[j])[0]; // here because I won't know what are the actual names of those attributes
                console.log("Person's Value: " +attribute_name +"->" + data.person[i].attributes[j][attribute_name]); // this gives undefined
            }
        }
    </script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多