手动解析JSON

时间:2011-06-26 15:02:50

标签: javascript json parsing

我需要解析一个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属性的值只能是数字字符串或其他对象,即没有数组。

我真的很挣扎,所以如果有人能帮助我开始(或者已经有完全解决方案),我们将非常感激。

4 个答案:

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

为每个构造实现类似的功能,即parseStringparseArrayparseObject,....

给定这些函数,编写一个跳过空格的函数parse,并根据第一个非空白字符决定调用上述哪个函数。如果是n,请致电parseNull,如果{,请致电parseObject等。请注意,parseArrayparseObject会自行调用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'}