如何解析不带引号的JSON字符串

时间:2013-02-21 14:48:57

标签: java json

我有一个JSON字符串,其中没有引用键和值,我想将其转换为格式正确的JSON。

{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}

是否有可以处理它的Java库?我试过了Jackson,但它不起作用。

的问候, 扬

3 个答案:

答案 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接口的具体实现:

  • ReaderBasedJsonParser,一个字符流解析器(编码 独立)
  • UTF8StreamJsonParser,一个针对UTF-8字节优化的解析器 流

这两个类中的代码非常多余,可能是必要的。每个类都有一个方法,当遇到意外字符时,nextToken()调用该方法。 ReaderBasedJsonParser的名称为_handleOddValue(),而UTF8StreamJsonParser的名称为_handleUnexpectedValue()。就像接受“NaN”作为数值并允许单引号字符串值在这里发生一样。

我的计划(在我意识到并实现了一个可怕的黑客足以满足我的短期需求之前)是将这些解析器中的一个/两个子类化并覆盖上面的方法来处理不带引号的字符串值。因为当输入流在字段值的上下文中时(在识别冒号之后)调用此方法,所以应该可以向前读取,直到遇到逗号或右花括号并将读取的所有内容计为一个字符串值。这段代码写起来很棘手,因为它需要理解Jackson的缓冲策略,解析器的架构(当前缓冲区的当前指针是一个实例变量)等等。

要使ObjectMapper使用此自定义解析器,必须将JsonFactory子类化,并使用实例化它的方法覆盖_createParser()方法。可能需要做更多工作才能使常规解析器和UTF-8解析器正常工作,但如果性能不是问题,则强制使用常规解析器就足够了。然后,可以将此自定义JsonFactory的实例传递给ObjectMapper的构造函数。

希望这有助于某人。