首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析未加引号的JSON字符串

如何解析未加引号的JSON字符串
EN

Stack Overflow用户
提问于 2013-02-21 22:48:57
回答 4查看 7.9K关注 0票数 14

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

代码语言:javascript
运行
复制
{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}

有没有Java库可以处理它?我尝试过Jackson,但它不起作用。

EN

回答 4

Stack Overflow用户

发布于 2013-02-21 22:54:57

您可以对Jackson使用JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,以允许未加引号的字段名称:

代码语言:javascript
运行
复制
JsonFactory factory = new JsonFactory();
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json"));
票数 7
EN

Stack Overflow用户

发布于 2016-01-15 00:17:50

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

https://github.com/ischumacher/rsjp

以下是您的示例JSON的示例用法:

代码语言:javascript
运行
复制
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"));

下面是输出:

代码语言:javascript
运行
复制
{
   basic: 
   {
      0: 
      {
         index: 0, 
         license: t, 
         nameSID: n, 
         image: img_left, 
         descriptionSID: t, 
         category: r
      }
   }
}

img_left
票数 3
EN

Stack Overflow用户

发布于 2016-04-22 00:13:43

我研究了如何定制Jackson来处理非引号的字段值(vs.字段名)。尽管我最终写了一个hack,但我还是在这里为其他人发布了我的面包屑踪迹。我的代码探索是在Jackson 2.7.2中完成的。

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

编码字符流的解析器(

  • ReaderBasedJsonParser,independent)
  • UTF8StreamJsonParser,针对UTF-8字节流优化的解析器

这两个类中的代码非常冗余,很可能是出于需要。每个类都有一个方法,当遇到意外字符时,nextToken()将调用该方法。ReaderBasedJsonParser的命名为_handleOddValue(),UTF8StreamJsonParser的命名为_handleUnexpectedValue()。像接受"NaN“作为数值和允许单引号字符串值这样的事情就发生在这里。

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

要使ObjectMapper使用这个自定义解析器,必须继承JsonFactory的子类,并用实例化它的方法覆盖_createParser()方法。要使常规解析器和UTF-8解析器都正常工作,可能需要做更多的工作,尽管如果性能不是问题的话,强制使用常规解析器就足够了。然后,这个自定义JsonFactory的实例可以被传递到ObjectMapper的构造函数中。

希望这对某些人有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15005185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档