Разбор json, ключ без кавычек

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

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

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

Thanx много заранее.

EDIT: пожалуйста см. следующее, Если свое правильно

{

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

    ]

}

5 ответов


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

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

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

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


Я хотел эквивалент 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).


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

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


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

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);

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


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

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

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

чтобы добавить кавычки, замените на \"\".

пример:

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

выход:

{ "custType": "Active", "custAccount": "Premium" }