Java 如何解析无引号的JSON字符串

Java 如何解析无引号的JSON字符串,java,json,Java,Json,我有一个JSON字符串,其中既没有引用键也没有引用值,我想将其转换为格式正确的JSON {basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}} 是否有一个Java库可以处理它?我试过了,但不起作用。您可以使用JsonParser.Feature。允许\u UNQUOTED\u FIELD\u NAMES与Jackson一起使用,以允许使用UNQUOT

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

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

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

您可以使用
JsonParser.Feature。允许\u UNQUOTED\u FIELD\u NAMES
与Jackson一起使用,以允许使用UNQUOTED字段名:

JsonFactory factory = new JsonFactory();
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json"));

我不确定你是否有时间写你自己的解析器,但我写了

下面是示例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"));

我研究了如何定制Jackson来处理未引用的字段值(相对于字段名)。尽管我最终写了一篇黑客文章,我还是在这里为其他人发布我的面包屑线索。我的代码探索是在Jackson 2.7.2中完成的

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

  • ReaderBasedJsonParser,字符流(编码)的解析器 (独立)
  • UTF8StreamJsonParser,一个为UTF-8字节优化的解析器 溪流
这两个类中的代码非常冗余,可能是出于需要。每个类都有一个方法,当遇到意外字符时,nextToken()将调用该方法。ReaderBadeJSONParser的名为_handleOddValue(),UTF8StreamJsonParser的名为_handleUnexpectedValue()。这里发生了接受“NaN”作为数值并允许单引号字符串值的事情

我的计划(在我清醒过来并意识到一个可怕的黑客可以满足我的短期需求之前)是对其中一个/两个解析器进行子类化,并重写上面的方法来处理无引号的字符串值。因为当输入流在字段值的上下文中时(识别冒号之后)调用此方法,所以应该可以向前读取,直到遇到逗号或右大括号,并将读取到该点的所有内容作为字符串值计数。编写此代码很困难,因为它需要了解Jackson的缓冲策略、解析器的体系结构(当前缓冲区中的当前指针是一个实例变量)等

要使ObjectMapper使用此自定义解析器,必须将JsonFactory子类化,并用实例化它的方法重写_createParser()方法。要使常规解析器和UTF-8解析器都能正常工作,可能还需要做更多的工作,不过如果性能不受关注,就可以强制使用常规解析器。然后,可以将此自定义JsonFactory的实例传递到ObjectMapper的构造函数中


希望这对其他人有所帮助。

我确实使用了它,但对于
“许可证”中的无引号的值或无引号的数字键(例如“0:myValue”):“1,2”
格式错误为
许可证:1,2
您建议如何选择解释?我猜你将不得不编写自己的反序列化程序。Jackson的
对象映射器
模块
功能可能会对您有所帮助。在我的情况下,我知道我只有字符串,而没有
作为值。但是,是的,看起来我必须编写自己的解析器。
{
   basic: 
   {
      0: 
      {
         index: 0, 
         license: t, 
         nameSID: n, 
         image: img_left, 
         descriptionSID: t, 
         category: r
      }
   }
}

img_left