我有一个JSON字符串,其中没有引用键和值,我想将其转换为格式正确的JSON。
{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}有没有Java库可以处理它?我尝试过Jackson,但它不起作用。
发布于 2013-02-21 22:54:57
您可以对Jackson使用JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,以允许未加引号的字段名称:
JsonFactory factory = new JsonFactory();
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json"));发布于 2016-01-15 00:17:50
我不确定你是否有时间编写自己的解析器,但我做到了。
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发布于 2016-04-22 00:13:43
我研究了如何定制Jackson来处理非引号的字段值(vs.字段名)。尽管我最终写了一个hack,但我还是在这里为其他人发布了我的面包屑踪迹。我的代码探索是在Jackson 2.7.2中完成的。
Jackson Core附带了JsonParser接口的两个具体实现:
编码字符流的解析器(
这两个类中的代码非常冗余,很可能是出于需要。每个类都有一个方法,当遇到意外字符时,nextToken()将调用该方法。ReaderBasedJsonParser的命名为_handleOddValue(),UTF8StreamJsonParser的命名为_handleUnexpectedValue()。像接受"NaN“作为数值和允许单引号字符串值这样的事情就发生在这里。
我的计划(在我清醒过来并意识到一个可怕的黑客可以满足我的短期需求之前)是对这两个解析器中的一个/两个进行子类化,并覆盖上面的方法来处理未加引号的字符串值。由于此方法是在输入流位于字段值的上下文中时调用的(就在识别冒号之后),因此应该可以向前读取,直到遇到逗号或右花括号,并将到那时为止读取的所有内容都计算为字符串值。这段代码很难编写,因为它需要了解Jackson的缓冲策略、解析器的体系结构(指向当前缓冲区的当前指针是一个实例变量)等。
要使ObjectMapper使用这个自定义解析器,必须继承JsonFactory的子类,并用实例化它的方法覆盖_createParser()方法。要使常规解析器和UTF-8解析器都正常工作,可能需要做更多的工作,尽管如果性能不是问题的话,强制使用常规解析器就足够了。然后,这个自定义JsonFactory的实例可以被传递到ObjectMapper的构造函数中。
希望这对某些人有帮助。
https://stackoverflow.com/questions/15005185
复制相似问题