用JSON替换嵌套字符串

时间:2016-10-17 12:10:42

标签: javascript json

我正在尝试做两件事:

  1. 在JSON文件中搜索字符串(" TODO")
  2. 替换它 带有先前发生的字符串的字符串("开始测验")
  3. 因此,所有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

5 个答案:

答案 0 :(得分:1)

你需要一系列for循环,从你的例子来看,目前尚不清楚TODO是否可以出现在JSON结构的任何地方或者只是在字段下面,所以我将假设它最简单,即它只能出现在fields数组

        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;
           } 
      }
    }
}

答案 1 :(得分:1)

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

&#13;
&#13;
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))
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我读了你之前的问题,以便更好地理解你的意思,我相信这就是你正在寻找的。

// 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;
    });
});

答案 3 :(得分:0)

你可以试试json stringify并替换方法

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);

答案 4 :(得分:0)

我为做疯狂的缩进而道歉但是当我在控制台工作时它会有所帮助。 JSON.stringify是(ab)用于其对象行走。当其中一个兄弟姐妹做的时候,我抓住第一个没有'TODO'值的兄弟姐妹......选择'todo'之前的那个兄弟是很困难的,因为它是一张地图而不是一个阵列地图正式“有一个'之前'不要做字符串操作。这就是你这样做的方式。

请注意,我正在改变传递给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"
          }
        ]
      }
    ]
  })