我需要解析一个JSON字符串,如下所示:
var json =
"{\
foo: {\
bar: 'something',\
baz: {\
jack: 'other',\
jill: 5\
},\
bob: {\
bill: 'hello',\
bilbo: 11,\
baggins: {\
fizz: 'buzz'\
}\
}\
}\
}";
我无法使用eval
或JS库将其解析为JavaScript对象。我可以使用的只是String,Object等方法。
解析的结果应该是一个JS对象,其属性对应于JSON的属性。 JSON属性的值只能是数字字符串或其他对象,即没有数组。
我真的很挣扎,所以如果有人能帮助我开始(或者已经有完全解决方案),我们将非常感激。
答案 0 :(得分:4)
var json = Function("return {\
foo: {\
bar: 'something',\
baz: {\
jack: 'other',\
jill: 5\
},\
bob: {\
bill: 'hello',\
bilbo: 11,\
baggins: {\
fizz: 'buzz'\
}\
}\
}\
}")(); // object
答案 1 :(得分: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};
}
为每个构造实现类似的功能,即parseString
,parseArray
,parseObject
,....
给定这些函数,编写一个跳过空格的函数parse
,并根据第一个非空白字符决定调用上述哪个函数。如果是n
,请致电parseNull
,如果{
,请致电parseObject
等。请注意,parseArray
和parseObject
会自行调用parse
。
答案 2 :(得分:2)
以phihag的答案为基础,我就是这样做的。这对你来说可能是一个开始。
它不支持:
,{}:"
为键/值代码:
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
答案 3 :(得分:0)
可能有理由使用自定义JSON解析方法,但是如果这正是您想要的...
JavaScript为您内置了所有功能。
这是一个例子:
var json = JSON.parse('{"myKey":"myValue"}');
console.log(json); // {myKey:'myValue'}