我有一个 JSON 字符串,其中既没有引用键也没有引用值,我想将其转换为格式正确的 JSON。
{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}
有可以处理它的Java库吗?我试过杰克逊,但它不起作用。
您可以JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES
与 Jackson 一起使用以允许不带引号的字段名称:
JsonFactory factory = new JsonFactory();
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json"));
不确定你是否有时间编写自己的解析器,但我做到了。
https://github.com/ischumacher/rsjp
这是您的示例 JSON 的示例用法:
String str = "{basic:{0:{index:0, license:t, nameSID:n, image:\"img_left\", descriptionSID:t, category:r}}";
Map<String, Object> jso = Json.parseJSON(str);
System.out.println(jso);
System.out.println(Json.get(jso, "basic", "0", "image"));
这是输出:
{
basic:
{
0:
{
index: 0,
license: t,
nameSID: n,
image: img_left,
descriptionSID: t,
category: r
}
}
}
img_left
我研究了如何自定义 Jackson 以处理未引用的字段值(相对于字段名称)。尽管我最终写了一个 hack,但我还是在这里为其他人发布了我的面包屑路径。我的代码探索是在 Jackson 2.7.2 中完成的。
Jackson Core 带有 JsonParser 接口的两个具体实现:
这两个类中的代码非常多余,可能是出于必要。每个类都有一个方法,当遇到意外字符时由 nextToken() 调用。ReaderBasedJsonParser 的名称为 _handleOddValue(),UTF8StreamJsonParser 的名称为 _handleUnexpectedValue()。像接受“NaN”作为数值并允许单引号字符串值之类的事情发生在这里。
我的计划(在我意识到并意识到一个可怕的 hack 足以满足我的短期需求之前)是对这些解析器中的一个/两个进行子类化,并覆盖上面的方法来处理未引用的字符串值。因为当输入流在字段值的上下文中时调用此方法(就在识别冒号之后),所以应该可以向前读取,直到遇到逗号或右花括号并将读取到该点的所有内容计数为一个字符串值。这段代码编写起来很棘手,因为它需要了解 Jackson 的缓冲策略、解析器的架构(指向当前缓冲区的当前指针是一个实例变量)等。
要使 ObjectMapper 使用此自定义解析器,必须继承 JsonFactory 并使用实例化它的方法覆盖 _createParser() 方法。可能需要做更多工作才能使常规解析器和 UTF-8 解析器都能正常工作,但如果不考虑性能,强制使用常规解析器就足够了。然后,可以将这个自定义 JsonFactory 的实例传递给 ObjectMapper 的构造函数。
希望这可以帮助某人。
可以使用nuget包unquotedJson
,安装后执行如下F#代码,会得到更严重的引用json格式:
let x = """{
0:{index:0, license:t, nameSID:n, image:"img:left", descriptionSID:t, category:r}
}"""
let y =
x
|> JSON.parse
|> JSON.stringifyNormalJson
是y
:
{"0":{"index":0,"license":"t","nameSID":"n","image":"img:left","descriptionSID":"t","category":"r"}}