2011-06-26 7 views
0

は、私は以下のようなものとして、JSON文字列を解析する必要があります。解析JSON手動

var json = 
"{\ 
foo: {\ 
    bar: 'something',\ 
    baz: {\ 
    jack: 'other',\ 
    jill: 5\ 
    },\ 
    bob: {\ 
    bill: 'hello',\ 
    bilbo: 11,\ 
     baggins: {\ 
     fizz: 'buzz'\ 
     }\ 
    }\ 
    }\ 
}"; 

私はJavaScriptオブジェクトにこれを解析するevalやJSライブラリを使用することはできません。私が利用できるのは、String、Objectなどのメソッドです。

解析結果はJSONのプロパティに対応するJSオブジェクトである必要があります。 JSONプロパティの値は、文字列やその他のオブジェクト(配列なし)のみです。

私はこれで本当に苦労しています。誰かが私の手伝いをすることができれば(またはすでに完全な解決策があります)、非常に感謝しています。

+0

最近のブラウザでは、「JSON」が提供されています。これの文脈は何ですか?なぜライブラリはありませんか? 'json2.js'実装を見てみましょう:https://github.com/douglascrockford/JSON-js/blob/master/json2.js –

+2

これは完全に無意味な作業のようです。 json2.jsでも 'eval'を使います。 – lonesomeday

+2

ええ、それは宿題です。なぜ彼はネイティブなJSONのものを使うことができないのですか? – ryber

答えて

2

幸いなことに、JSONは非常に解析が簡単です。それぞれconstructの解析関数を書くだけです。例えば、ここにnull解析し、一つだ:

function parseNull(input, position) { 
    if (input.substr(position, 4) != "null") throw "Cannot parse as null"; 
    return {result:null, position: position+4}; 
} 

は、各構築物について同様の機能を実装し、すなわちparseStringparseArrayparseObject、...。

与えられた関数parseは、空白をスキップし、最初の非空白文字に基づいて上記の関数のどれを呼び出すかを決定します。それがnの場合は、parseNull{の場合はparseObjectなどと呼び出してください。 parseArrayparseObjectparseとなります。

4
var json = Function("return {\ 
foo: {\ 
    bar: 'something',\ 
    baz: {\ 
    jack: 'other',\ 
    jill: 5\ 
    },\ 
    bob: {\ 
    bill: 'hello',\ 
    bilbo: 11,\ 
     baggins: {\ 
     fizz: 'buzz'\ 
     }\ 
    }\ 
    }\ 
}")(); // object 
+0

'Function'は有効なJavaScriptコードを受け取りますが、" just "JSONは受け付けません。 – Gumbo

+0

+1賢明ですが、もちろん安全ではなく、技術的にのみ* 'eval'を使用していません。 – phihag

1

フィハグの回答に基づいて作成しました。私はこれを作成しました。それはあなたのためのスタートかもしれません。

それはサポートしていません:,{}:"

  • キー/値
  • として配列
  • のどれ
  • (おそらくよりハンドリングエラーなしのキー/値
    • スペース - 私の避難所を」これを広範囲にテストした)

    コード:

    var json = '{"a":{"b":"test"},"c":123,"d":{"nested":{"key":null}}}'; 
    
    var split = function(str, delimiter, func) { 
        var res = []; 
        var before = 0; 
        for(var i = 0; i < str.length; i++) { 
         if(str[i] === delimiter) { 
          if(func(str, i) === true) { 
           res.push(str.substring(before, i)); 
           before = i + 1; 
          } 
         } 
        } 
        res.push(str.substring(before)); 
        return res; 
    }; 
    
    var amountbefore = function(str, pos, character) { 
        var amount = 0; 
        for(var i = 0; i < pos; i++) { 
         if(str[i] === character) { 
          amount++; 
         } 
        } 
        return amount; 
    }; 
    
    var parse = function(obj) { 
        var stripped = obj.slice(1, -1); 
        var splitted = split(stripped, ",", function(str, i) { 
         return amountbefore(str, i, "{") === amountbefore(str, i, "}"); 
        }); 
        var res = {}; 
        if(stripped === "") return res; 
        for(var i = 0; i < splitted.length; i++) { 
         var spl = split(splitted[i], ":", function(str, i) { 
          return amountbefore(str, i, "{") === amountbefore(str, i, "}") 
         }); 
         var val; 
         if(spl[1][0] === "n")  val = null; 
         if(/^\d/.test(spl[1][0])) val = spl[1] - 0; 
         if(spl[1][0] === "\"") val = spl[1].slice(1, -1); 
         if(spl[1][0] === "{")  val = parse(spl[1]); 
         res[spl[0].slice(1, -1)] = val; 
        } 
        return res; 
    }; 
    
    parse(json); // parses the JSON string