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

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

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

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

问候,Jan

您可以将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 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以处理非引用的字段值(与字段名称相比)。 虽然我最后写了一个黑客,但我在这里发布我的面包屑踪迹给其他人。 我的代码探险是在jackson2.7.2中完成的。

Jackson Core附带了JsonParser接口的两个具体实现:

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

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

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

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

希望这有助于某人。