2016-10-17 4 views
1

でネストされた文字列に置き換えます私は二つのことをやろうとしていますJSON

  1. の文字列(「TODO」)
  2. のためのJSONファイルを検索し、以前に発生した文字列(「スタートでその 文字列を置き換えますクイズ ")

したがって、すべての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

JavaScriptでこれを処理するための最良の方法は、JSONを解析結果のオブジェクトと連携して、戻って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; 
      } 
     } 
    } 
} 
+0

答えをありがとう、以前のキー値のペアにアクセスする方法はありますか? – timothyylim

+0

編集してください。 – jacobdo

0

あなたの前の質問を読んで、あなたが何を意味しているのかをよりよく理解し、これがあなたが探しているものだと私は信じています。入力JSON構造を分析

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

、あなたは、オブジェクトの重要な配列がfields財産であることを検出することができます。 (私はJSON.parse()とJSON.stringifyを使用して文字列を変更しますuはメソッドに

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


は、次のアプローチを使用します):

$('.updateJSON').click(function() { 

    // get json 
    var json = $("#json").html(); 

    // parse and update json 
    var obj = JSON.parse(json), 
    objLength = (obj.semantics.length - 1), 
    objCount = 0; 
    while (objCount <= objLength) { 
    var index = 0, 
     length = 0, 
     element; 
    jQuery.each(obj, function() { 
     element = this[objCount]; 
     length = element.fields.length; 
     while (index < length) { 
     if (element.fields[index].default && element.fields[index].default === 'TODO') { 
      element.fields[index].default = 'START'; 
     } 
     index++; 
     } 
    }); 
    objCount++; 
    } 

    // return updated json 
    json = JSON.stringify(obj); 
    $("#json").html(json); 
}); 

また、 sの行"englishLabel": "Display introduction",コンマは必要ありません。

0

をJSON文字列化を試みると交換することができます

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

0

私は狂ったインデントをすることをお詫びしますが、私はコンソールで作業するときに役立ちます。 JSON.stringifyはオブジェクト歩行のために(ab)使用されます。私はその兄弟の一人が「TODO」の価値を持たない最初の兄弟をつかまえます...「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" 
      } 
     ] 
     } 
    ] 
    }) 
関連する問題