【问题标题】:How to load a JSON file into java that has unique name for each record?如何将 JSON 文件加载到每条记录具有唯一名称的 java 中?
【发布时间】:2014-10-21 05:11:38
【问题描述】:

例如我的 JSON 文件如下所示;

{
  "Test1": {
  "A": {},
  "B": "1",
  "C": "2",
  "D": "3"
 },
  "Test2": {
  "A": {},
  "B": "4",
  "C": "5",
  "D": "6"
 },
  "Test3": {
  "A": {},
  "B": "7",
  "C": "8",
  "D": "9"
 },
  "Test4": {
  "A": {},
  "B": "10",
  "C": "11",
  "D": "12"
 }

 ...
 ...
}

如果文件只包含几条记录,这会很简单,但在我的情况下,我要处理数千条记录。对于更简单的版本,我使用了 gson 库,但不确定如何将每个记录具有唯一名称的 JSON 文件加载到 Java 中。

***************更新************************************

我现在设法读取原始数据并映射数据。但是,还有一个小问题。

这是我用来映射的代码

ObjectMapper mapper = new ObjectMapper();
File jsonFile = new File(jsonFilePath);
        Map<String, Object> mapObject = mapper.readValue(jsonFile,
                new TypeReference<Map<String, Object>>() {
                });

System.out.println(mapObject.get("Test1"));

我得到了低于结果,这很好。但是,不确定如何获取地图“值”中的数据。

{A={}, B=1, C=2, D=3}

我尝试在下面重新映射,但它按预期失败,因为键不再被双引号括起来(见上文)!

Map<String, Object> nestedObject = mapper.readValue(
                mapObject.get("Test1").toString(),
                new TypeReference<Map<String, Object>>() {
                });

【问题讨论】:

  • 原始阅读。将其作为地图阅读。然后你会有一个字符串到对象的映射。
  • @Dan,谢谢你的建议!
  • @DanTemple 我已经更新了问题,请看看您是否可以提供帮助。欢呼
  • “我的结果低于”——不,你没有。 "System.out.println(mapObject.get("Test1");" 不会编译。
  • @specializt,感谢您的指出!我在这里重新输入了代码,因此我错过了“)”。除了那个例外,它确实打印了如上所示的结果!

标签: java json gson


【解决方案1】:

如果您知道您的对象都包含相同的键 A、B、C 和 D,那么您可以创建一个映射单个对象的

class MyEntry {
  /**
   * You've tagged the question "gson" but your example code uses Jackson so I've
   * written this class with Jackson annotations rather than Gson ones.
   */
  @JsonProperty("A")
  public Object a; // or a more specific type if you know one

  @JsonProperty("B")
  public String b;

  @JsonProperty("C")
  public String c;

  @JsonProperty("D")
  public String d;
}

然后将 JSON 解组为 Map&lt;String, MyEntry&gt;

Map<String, MyEntry> mapObject = mapper.readValue(jsonFile,
    new TypeReference<Map<String, MyEntry>>() {
    });

System.out.println(mapObject.get("Test1").b); // prints 1

【讨论】:

  • 感谢您的建议。它不像 A、B、C、D 那样简单,因为我有未知记录(超过 1000 条)。对于更简单的一个,我使用了 gson(上面的示例是在 Jackson 中实现的,但最初我将 gson 用于其他工作)来实现一个类来解析 JSON 文件。但是我猜给我的数据文件嵌套不好!
猜你喜欢
  • 2020-01-06
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多