Разбор 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" }