【问题标题】:Replace nested string in JSON替换 JSON 中的嵌套字符串
【发布时间】:2016-10-17 12:10:42
【问题描述】:

我正在尝试做两件事:

  1. 在 JSON 文件中搜索字符串(“TODO”)
  2. 替换那个 字符串与之前出现的字符串(“开始测验”)

因此,所有 TODO 都必须替换为“englishDefault”中出现的字符串。

我有以下 JSON:

{
  "semantics": [
    {
      "englishLabel": "Quiz introduction",
      "fields": [
        {
          "englishLabel": "Display introduction",
        },
        {
          "englishDefault": "Start Quiz",
          "default": "TODO"
        }
      ]
    }
  ]
}

第 2 部分已经解决,但我无法扩展答案: Replace with previous string in a JSON array

【问题讨论】:

  • 在 JavaScript 中处理此问题的最佳方法是解析 JSON,使用结果对象,然后将对象序列化回 JSON。其他任何事情都会涉及脆弱的黑客攻击。

标签: javascript json


【解决方案1】:

您在这里需要一系列 for 循环,从您的示例来看,尚不清楚 TODO 是否可以出现在 JSON 结构中的任何位置或字段下方,因此我将假设最简单,即它只能出现在字段数组

        for(var i = 0; i < semantics[0].fields.length; i++)
        {
          var fields = semantics[0].fields[i];

          //declare empty previous variable to store the previous key
          var previousKey;
          for (var key in fields) {

          if (p.hasOwnProperty(key)) {
            var value = fields[key];

           if(value == 'TODO')
           {
             console.log('Found TODO, please replace');
           }
           else {
             //If value was not TODO, then we save the present key to be used in the next iteration step as the previous key
             previousKey = key;
           } 
      }
    }
}

【讨论】:

  • 感谢解答,有没有办法访问之前的键值对?
【解决方案2】:

分析输入的 json 结构,您可以检测到关键的对象数组在 fields 属性中。
使用以下方法:

var jsonData = '{"semantics":[{"englishLabel":"Quiz introduction","fields":[{"englishLabel":"Display introduction"},{"englishDefault":"Start Quiz","default":"TODO"}]}]}';

jsonData = JSON.parse(jsonData);
jsonData['semantics'][0]['fields'].forEach(function(o){
    o['default'] && o['default'] === 'TODO' && (o['default'] = o['englishDefault']);
})

console.log(JSON.stringify(jsonData, 0, 4))

【讨论】:

    【解决方案3】:

    我阅读了您之前的问题以更好地理解您的意思,我相信这就是您要寻找的。​​p>

    // Assign json to a variable so we can mutate it using JS
    var data = {
      "semantics": [
        {
          "englishLabel": "Quiz introduction",
          "fields": [
            {
              "englishLabel": "Display introduction",
            },
            {
              "englishDefault": "Start Quiz",
              "default": "TODO"
            }
          ]
        }
      ]
    };
    
    // Loop over semantics and then fields to find the default values with TODO
    // Replace by simply assigning the new value
    data.semantics.forEach(function(semantic) {
        semantic.fields.forEach(function(field) {
            if (field.default === 'TODO')
                field.default = field.englishDefault;
        });
    });
    

    【讨论】:

      【解决方案4】:

      你可以试试json字符串化和替换方法

      var js_replace = {
        "semantics": [
          {
            "englishLabel": "Quiz introduction",
            "fields": [
              {
                "englishLabel": "Display introduction",
              },
              {
                "englishDefault": "Start Quiz",
                "default": "TODO"
              }
            ]
          }
        ]
      };
      
      var data= JSON.stringify(js_replace).replace(/TODO/g, '"REPLACETHIS"');
      console.log(data);
      

      【讨论】:

        【解决方案5】:

        我很抱歉做了疯狂的缩进,但是当我在控制台中工作时它会有所帮助。 JSON.stringify (ab)用于其对象行走。我抓住了第一个没有“TODO”值的兄弟姐妹,而它的兄弟姐妹中有一个......很难选择“在”“待办事项”之前的那个,因为它是一个映射而不是数组映射正式不” t 有一个“之前”不要做字符串操作。你就是这样做的。

        请注意,我正在改变传递给 deToDoify 的对象,还请注意,这是通用目的,无论“TODO”值在哪里,都会深刻改变任何结构。

        const deToDoify = x =>
        { JSON.stringify
          (x,
            (k,v) =>
            { const keys = Object.keys( v )
              let toDude;
              const check = keys.some
              ( a=> ((v[a] == 'TODO') && (toDude=a,1) ))
              if ( check )
              { keys.some
                ( a => ((v[a] !== 'TODO') && (v[toDude] = v[a],1) )) }
              return v } )
           return x }
        
        deToDoify(
          {
            "semantics": [
              {
                "englishLabel": "Quiz introduction",
                "fields": [
                  {
                    "englishLabel": "Display introduction",
                  },
                  {
                    "englishDefault": "Start Quiz",
                    "default": "TODO"
                  }
                ]
              }
            ]
          })
        

        【讨论】:

          猜你喜欢
          • 2017-03-20
          • 2021-10-24
          • 2013-01-19
          • 1970-01-01
          • 2014-04-09
          • 2020-02-16
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          相关资源
          最近更新 更多