2

「AAA.BBB[0].CCC.DDD [5] .EEE=123」という形式の文字列がたくさんあります。一部には、さらに深くネストされた配列が含まれています。そのドット表記を同等のJSONオブジェクトに変換するにはどうすればよいですか?追加の利点がある場合は、jQueryを使用しています。ALMOSTでこれを行う方法を見つけましたが、配列が含まれている場合は解決策が機能しません。

編集:私は多くの文字列に対してこれを行い、最終的にそれらを組み合わせる必要があります。特に、これはフォームのオブジェクトになるはずです(エラーが発生しなかったと仮定します):{"AAA":{"BBB":["CCC:{" DDD ":[{}、{}、 {}、{}、{}、{"EEE":123}]}]}}

4

2 に答える 2

3

あなたが説明しているのは、JSONに変換できるものではありません。あなたが説明しているのは、確かにオブジェクトへの階層ですが、そこにそれらの中括弧があると、明らかに、はるかに大きなオブジェクトの1つの部分だけを見ていることになります。ただし、パーサーがその文字列をjavascriptオブジェクトに変換するには、次のようにすることができます。

function splitStringToObject(string){
  var sourceArray = string.split('.');
  var top = {};
  var point = top;
  while (sourceArray.length){
    var work = sourceArray.shift();
    if ( /([a-zA-Z_][a-zA-Z0-9_]*)\[([a-zA-Z0-9_]+)\]/.test(work) ){
      console.log('found match alpha index')
      //found an array identifier with a variable name inside ('bbb[aaa]')
      var matches = /([a-zA-Z_][a-zA-Z0-9_]*)\[([a-zA-Z0-9_]+)\]/.exec(work);
      var matchName = matches[1];
      var matchIndex = matches[2];
      point[matchName] = [];
      point[matchName][matchIndex] = {};
      point = point[matchName][matchIndex];
    } else if ( /([a-zA-Z_][a-zA-Z0-9_]*)\[([0-9]+)\]/.test(work) ) {
      console.log('found match numeric index')
      //found an array identifier with a numeric index inside ('bbb[0]')
      var matches = /([a-zA-Z_][a-zA-Z0-9_]*)\[([a-zA-Z0-9_]+)\]/.exec(work);
      var matchName = matches[1];
      var matchIndex = matches[2];
      point[matchName] = [];
      point[matchName][matchIndex] = {};
      point = point[matchName][matchIndex];
    } else if ( work.indexOf('[') > -1 || work.indexOf(']') > -1 ) {
      console.log('found bad egg with ' + work)
    } else if ( work.indexOf('=') > 0 ) { 
      console.log('found = inside')
      //test for equals sign in the string
      var morework = work.split('=');
      work = morework[0].trim();
      sourceArray.push('='+morework[1])
      point[work] = morework[1].trim();
      point = point[work];
    } else { 
      console.log('found plain word')
      //assume work is aok to use as another object here.
      work = work.trim();
      point[work] = {};
      point = point[work];
    }
  }
  //you may not want this next part
  var ret;
  //let's pull our value off the top, altho if we do this, I don't know
  //how to retain the name. I prefer to return it under top still
  for (var k in top){
    ret = top[k];
  }

  console.log(ret);
  return ret;

  // alternately call
  return top;
}

ただし、これは単なるパーサーです。どのように使用しますか?さて、私たちはそれに私たちの文字列を供給する必要があります。次のように、すべての文字列をきちんと配列に入れることができると仮定します。

var strings = [
  "AAA.BBB[0].CCC.DDD[1].EEE = 123",
  "AAA.BBB[0].CCC.DDD[2].EEE = 123",
  "AAA.BBB[0].CCC.DDD[4].EEE = 123",
  "AAA.BBB[0].CCC.DDD[5].EEE = 123",
];

そして、次の部分は、ここに示すように、本当に簡単になります。

var objectsConverted = [];
for(var k in strings){
  objectsConverted[k] = splitStringToObject(strings[k]);
}

var result = {};
for(var k in objectsConverted){
  jQuery.extend(true,result,objectsConverted[k]);
}

console.log(result);

そして、1日の終わりにJSON.stringify(result)を取得すると、次のようになります。

"{"BBB":[{"CCC":{"DDD":[null,{"EEE":"123"},{"EEE":"123"},null,{"EEE":"123"},{"EEE":"123"}]}}]}"

関数の最後にある警告を読んでください。returnメソッドを選択したため、名前空間が失われます(一度下にネストするのではなく、上から戻ってきます)

于 2012-06-19T22:26:30.253 に答える
0

AAA.BBB[0].CCC.DDD[5].EEE

になる:

{AAA : {
  BBB : [{ 
   CCC: {
    DDD: [ 
...

メンバーがある場合は、それを要素の配列にX[Y]マッピングするオブジェクトに変換する必要があります。X

それは役に立ちますか?

于 2012-06-19T21:38:21.333 に答える