我有一个JSON字符串,其中没有引用键和值,我想将其转换为格式正确的JSON。
{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}
是否有可以处理它的Java库?我试过了Jackson,但它不起作用。
的问候, 扬
答案 0 :(得分:5)
您可以将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"));
答案 1 :(得分:1)
不确定你是否还要编写自己的解析器,但我做到了。
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
答案 2 :(得分:0)
我研究了如何定制杰克逊来处理非引用的字段值(与字段名称对比)。虽然我最后写了一个黑客,但我在这里发布我的面包屑踪迹给其他人。我的代码探险是在杰克逊2.7.2中完成的。
Jackson Core附带了两个JsonParser接口的具体实现:
这两个类中的代码非常多余,可能是必要的。每个类都有一个方法,当遇到意外字符时,nextToken()调用该方法。 ReaderBasedJsonParser的名称为_handleOddValue(),而UTF8StreamJsonParser的名称为_handleUnexpectedValue()。就像接受“NaN”作为数值并允许单引号字符串值在这里发生一样。
我的计划(在我意识到并实现了一个可怕的黑客足以满足我的短期需求之前)是将这些解析器中的一个/两个子类化并覆盖上面的方法来处理不带引号的字符串值。因为当输入流在字段值的上下文中时(在识别冒号之后)调用此方法,所以应该可以向前读取,直到遇到逗号或右花括号并将读取的所有内容计为一个字符串值。这段代码写起来很棘手,因为它需要理解Jackson的缓冲策略,解析器的架构(当前缓冲区的当前指针是一个实例变量)等等。
要使ObjectMapper使用此自定义解析器,必须将JsonFactory子类化,并使用实例化它的方法覆盖_createParser()方法。可能需要做更多工作才能使常规解析器和UTF-8解析器正常工作,但如果性能不是问题,则强制使用常规解析器就足够了。然后,可以将此自定义JsonFactory的实例传递给ObjectMapper的构造函数。
希望这有助于某人。