【问题标题】:Converting JSON Object(s) from file using Java使用 Java 从文件转换 JSON 对象
【发布时间】:2015-05-12 02:24:24
【问题描述】:

我有一个 JSON 文件,不知道其中的数据将如何存储,也不知道数据的结构。 唯一已知的是,它将具有 JSON 对象数组或单个 JSON 对象。

我需要从文件中获取每个对象并将其存储为单独的项目。如果文件中有对象数组,我应该得到一个可以存储在 DB 中的 JSON 字符串数组。 基本上,我需要读取这个文件并从中分离出每个 JSON 对象并将其作为字符串存储在 DB 中。

其中一种方法是使用 JACKSON ObjectMapper 并将这些项目作为键值对分配给 Hashmap,但如果文件中有 JSON 对象列表,我不确定如何完成。

示例 JSON 文件:

 [
   {
     "name":"Bob",
     "type":"Email",
     "from":"a@a.com",
     "to":"b@B.com",
     "attachments":[...],
     .
     .
     .
   }
 ]

【问题讨论】:

  • 你知道 JSON 的 Object 结构吗(可以是 Array 还是单个)?
  • 所以简而言之,你不知道它是以 '[' 还是 '{' 开头的,我是对的。还是该文件可能包含许多单独的 Json 值?
  • 我已经更新了我的问题。 @nafas 是的,它可能只包含一个对象或对象数组。
  • @prasadvsv : JSON 对象结构可能不一致,每种类型的文件都会改变,我添加了一个示例 JSON
  • 如果你不关心类:使用 Map。如果你关心类:制作一个输出 java 文件的模式解析器。

标签: java arrays json jackson


【解决方案1】:

你知道 JSON 的 Object 结构吗(让它是 Array 或单个)?如果是,


首先将文件中的json字符串加载到内存中的字符串中。

  • 检查字符串是否存在数组,方法是在多次出现“{”或“}”的外部结构中搜索“[”,“]”
  • 一旦您知道您拥有的是数组还是单个对象,您就可以将其作为对象引用传递给 Jackson 或 GS​​ON 解析器
  • 在 JsonObject.class 的内存数组中创建说 List。实际上,最好将此 List 包含在另一个类中。说 myJsonObjects,里面有一个 List。

让我们看看 GSON 解析器(由 google 提供),虽然 Jackson 也可以用于类似的实现

  Gson gson = new Gson();
  if(isArray){
     myJsonObjects  jsonArray = gson.fromJson(jsonStringFromFile,myJsonObjects );

  }
  else{
   gson.fromJson(jsonStringFromFile,JsonObject);
  }

http://google-gson.googlecode.com/svn-history/trunk/gson/docs/javadocs/com/google/gson/Gson.html

【讨论】:

  • 在解析之前检查字符串的好主意。
【解决方案2】:

Jackson 是我最喜欢的 JSON-to-POJO 库。从哪里加载 JSON(URL 或文件系统)并不重要,有多个输入源的处理程序。

这是一个例子:

Map<String,Object> userData = mapper.readValue(new File("user.json"), Map.class);

就您要解析的未知数量的 JSON 结构而言,首先想到的是为您所期望的每种类型都有一个映射器。然后,您可以将解析代码包装在 try/catch 块中,这样如果第一个代码因 Jackson 在遇到意外格式时给您的任何异常而失败,您就可以尝试下一个格式,依此类推。

如果你只是想通用地解析你事先不知道结构的 JSON,你可以尝试这样的事情:

mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {});

Jackson 的文档非常好——仔细阅读它肯定会有所帮助。这是一个很好的五分钟教程:http://wiki.fasterxml.com/JacksonInFiveMinutes

【讨论】:

  • 是的,我已经将 Jackson 用于预定义的类,并调用 objectMapper.readValue(file, List) 从文件中返回所有学生对象的列表。但是在这种情况下,我没有预定义的类,映射器会只映射一个对象或对象数组吗?我对 JACKSON 如何将分离的 JSON 对象从对象列表中返回给我感到困惑。 Map "userData" 中的每个条目是否都包含一个 JSON 对象?
  • Jackson 也支持映射多个对象。如果您仔细阅读文档,它肯定应该清楚地了解映射的工作原理。这是一个示例映射器:wiki.fasterxml.com/JacksonSampleSimplePojoMapper 如果我正确理解了您的 JSON 结构,它将始终是相同的密钥对,您可以拥有一个返回其代表性 POJO 列表的映射器以及单个映射器。
  • 查看第一个答案的例子:stackoverflow.com/questions/9829403/…
  • 如果你只是想通用地解析你事先不知道结构的 JSON,你可以在这里尝试第一个答案:stackoverflow.com/questions/18712495/…
  • 感谢您的链接,他们帮助我解决了这个问题
【解决方案3】:

我更喜欢使用 Gson:

Gson gson;
Map<String, Object>parameters=gson.fromJson(myString);

剩下的就是迭代地图了,希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    相关资源
    最近更新 更多