我正在尝试解析一个字符串,该字符串仅以JSON格式表示键未用引号括起来。我可以很好地在Javascript中解析这个字符串,但是找不到可以帮助我解析它的Java API。我尝试的所有API都采用严格的JSON格式。
任何人都可以建议一个可以解析这个问题的库,或者解决问题的全新方法(比如使用正则表达式)吗?
答案 0 :(得分:1)
这是使用下划线库的coffeescript解决方案。如果您没有使用它,可以用for循环替换_.foldl。
parseNonStrictJson = (value) ->
inQuote = false
correctQuotes = (memo, nextChar) ->
insertQuote =
(inQuote and not /[a-z0-9_"]/.test nextChar) or
(!inQuote and /[a-z_]/.test nextChar)
inQuote = (inQuote != (insertQuote or nextChar == '"') )
memo + (if insertQuote then '"' else '') + nextChar
valueWithQuotes = _.foldl(value + '\n', correctQuotes, "")
JSON.parse(valueWithQuotes)
在javascript中也一样:
function parseNonStrictJson(value) {
var correctQuotes, inQuote, valueWithQuotes;
inQuote = false;
correctQuotes = function(memo, nextChar) {
var insertQuote;
insertQuote = (inQuote && !/[a-z0-9_"]/.test(nextChar)) || (!inQuote && /[a-z_]/.test(nextChar));
inQuote = inQuote !== (insertQuote || nextChar === '"');
return memo + (insertQuote ? '"' : '') + nextChar;
};
valueWithQuotes = _.foldl(value + '\n', correctQuotes, "");
return JSON.parse(valueWithQuotes);
};
答案 1 :(得分:0)
如果密钥没有用引号括起来,那么它不是JSON。
你应该自己破解或找到已经做过的人。
此外,没有非严格的json 这样的东西。只有一个版本的JSON,它是严格的。
答案 2 :(得分:0)
就个人而言,您可以使用状态模式并添加引号。除非我错了,否则状态模式将逐个字符地读取并设置标志以指示我们是否在双引号条件内以及我们的双引号是否用反斜杠“引用”。使用这个,并且变量名称不以数字开头,您可以在流式传输时添加引号,然后按顺序发送它。
答案 3 :(得分:0)
您可以使用eval:
var parsed = eval(json)
要小心,因为eval
也可以运行代码,因此您必须确保知道要解析的内容。
还有一个名为jsonic的节点模块,用于解析非搅拌JSON。