разобрать JSON вручную - PullRequest
       2

разобрать JSON вручную

0 голосов
/ 26 июня 2011

Мне нужно проанализировать строку 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 всегда будут только числовыми строками или другими объектами, т.е. без массивов.

Я действительно борюсь с этим, поэтому, если кто-нибудь может помочь мне начать работу (или уже имеет полное решение), это будет очень цениться.

Ответы [ 3 ]

4 голосов
/ 26 июня 2011
var json = Function("return {\
foo: {\
  bar: 'something',\
  baz: {\
    jack: 'other',\
    jill: 5\
  },\
  bob: {\
    bill: 'hello',\
    bilbo: 11,\
      baggins: {\
        fizz: 'buzz'\
      }\
    }\
  }\
}")(); // object
2 голосов
/ 26 июня 2011

Опираясь на ответ Фихаг, я только что придумал это.Это может быть началом для вас.

Он не поддерживает:

  • Пробелы вне ключа / значения
  • Любой из ,{}:" в качестве ключа / значения
  • Массивы
  • Нет обработки ошибок
  • (Вероятно, больше - я не проверял это подробно)

Код:

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
2 голосов
/ 26 июня 2011

К счастью, JSON очень легко анализировать: просто напишите функции разбора для каждой конструкции .Например, вот тот, который анализирует 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...