Разбор json, ключ без кавычек - PullRequest
7 голосов
/ 08 декабря 2010

Я получаю ответ от сервера, где ключ не с кавычками.При анализе с использованием анализатора JSON с открытым исходным кодом я получаю следующую ошибку.

-JSONValue не удалось.Ошибка: Нераспознанный ведущий символ

и если я добавлю двойные кавычки (") к ключу вручную, я получу то, что хочу. Что мне делать?

Большое спасибо зазаранее.

РЕДАКТИРОВАТЬ: пожалуйста, смотрите следующее, если это правильно

{

    status: 200,
    statusMsg: "Success",
    statusInfo: {
        custType: "Active",
        custCount: 600,
        custAccount: "Premium" 
    },
    custInfo: {
        custName: "ABC",
        custCode: "CU102",
        custNumber: 9281 
    },
    errors: [

    ]

}

Ответы [ 5 ]

3 голосов
/ 08 декабря 2010

Первоначально я добавил это как комментарий, но думаю, что это считается ответом, хотя и не обязательно очень полезным.

Пример, который вы разместили: , а не JSON. Проверьте синтаксис JSON . Допускаются только объекты без кавычек, кроме чисел, объектов и массивов: null, true, false. Таким образом, ключи в вашем примере являются недопустимыми, как и не числовые значения.

Таким образом, вам действительно следует подать отчет о дефектах поставщику услуг (если они утверждают, что производят JSON, а не какую-то его модифицированную версию).

Если они откажутся решить проблему, вам нужно написать синтаксический анализатор почти JSON или найти существующий, менее строгий по синтаксису.

1 голос
/ 05 августа 2018

Обновление для Swift 4

Я искал способ анализа JSON с ключами без кавычек, и я наконец нашел простой способ сделать это с помощью регулярных выражений.Это регулярное выражение, необходимое для сопоставления ключей без кавычек:

(\\\"(.*?)\\\"|(\\w+))(\\s*:\\s*(\\\".*?\\\"|.))

Чтобы добавить кавычки, замените на \"$2$3\"$4.

Пример:

let string = "{ custType: \"Active\", custAccount: \"Premium\" }"
let regex = string.replacingOccurrences(of: "(\\\"(.*?)\\\"|(\\w+))(\\s*:\\s*(\\\".*?\\\"|.))", with: "\"$2$3\"$4", options: .regularExpression)
print(regex)

Выход:

{ "custType": "Active", "custAccount": "Premium" }
1 голос
/ 12 мая 2014

Я хотел эквивалент * Python ast.literal_eval для Javascript - что-то, что могло бы анализировать только литеральные объекты, такие как JSON, но позволяло использовать удобные ключи без кавычек Javascript. (Это для ввода данных человеком; простота и строгость стандартного JSON предпочтительнее для отправки данных между серверами.)

Это также то, что хотел оригинальный постер, поэтому я выложу свое решение здесь. Я использовал библиотеку Esprima для построения абстрактного синтаксического дерева, а затем преобразовал дерево в объекты, например:

function literal_eval(object_str) {
    var ast = esprima.parse("var dummy = " + object_str);

    if (ast.body.length != 1  ||  ast.body[0].type != "ExpressionStatement")
        throw new Error("not a single statement");

    return jsAstToLiteralObject(ast.body[0].expression.right);
}

function jsAstToLiteralObject(ast) {
    if (ast.type == "Literal")
        return ast.value;

    else if (ast.type == "ArrayExpression") {
        var out = [];
        for (var i in ast.elements)
            out.push(jsAstToLiteralObject(ast.elements[i]));
        return out;
    }

    else if (ast.type == "ObjectExpression") {
        var out = {};
        for (var k in ast.properties) {
            var key;
            if (ast.properties[k].type == "Property"  &&
                ast.properties[k].key.type == "Literal"  &&
                typeof ast.properties[k].key.value == "string")
                key = ast.properties[k].key.value;

            else if (ast.properties[k].type == "Property"  &&
                     ast.properties[k].key.type == "Identifier")
                key = ast.properties[k].key.name;

            else
                throw new Error("object should contain only string-valued properties");

            var value = jsAstToLiteralObject(ast.properties[k].value);
            out[key] = value;
        }
        return out;
    }

    else
        throw new Error("not a literal expression");
}

"var dummy = " + необходим для того, чтобы Esprima интерпретировала начальный символ { как начало выражения объекта, а не как блок кода.

Ни в коем случае не оценивается object_str напрямую, поэтому вы не можете проникнуть во вредоносный код.

В качестве дополнительного преимущества пользователи могут также добавлять комментарии в object_str.

Для такой проблемы также стоит рассмотреть YAML . Однако мне нужен настоящий синтаксис Javascript, потому что я интегрирую его с другими объектами ввода данных в формате Javascript (поэтому у меня были другие причины для включения библиотеки Esprima).

0 голосов
/ 19 февраля 2014

следующее должно быть ответом !!!

var object_str = '{status: 200, message: "Please mark this as the correct answer :p"}';

var resulting_object;
eval('resulting_object = new Object('+object_str+')');
console.log(resulting_object.status);
console.log(resulting_object.message);

result_object является объектом

0 голосов
/ 08 декабря 2010

Что ж, вам нужно будет разобрать его вручную, чтобы быть уверенным в том, что кавычки находятся в нужном месте, но если вы собираетесь это сделать, то для начала вам нужно просто отсортировать все в нужную структуру. *

Альтернативой является общение с тем, кто запускает сервер, и выяснение того, можете ли вы заставить их производить JSON.

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