Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JSON文件加载到每个记录都有唯一名称的java中?_Java_Json_Gson - Fatal编程技术网

如何将JSON文件加载到每个记录都有唯一名称的java中?

如何将JSON文件加载到每个记录都有唯一名称的java中?,java,json,gson,Java,Json,Gson,例如,我的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":

例如,我的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>>() {
                });

如果您知道您的对象都包含相同的键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解组为映射


原汁原味地读。把它当作地图来读。然后你就有了一个字符串到对象的映射。@Dan,谢谢你,我会试试你的建议的@Dantempe我已经更新了这个问题,请你帮忙。干杯,我的成绩低于预期——不,你没有。System.out.printlnmapObject.getTest1;不会编译。@specializet,谢谢您指出!我在这里重新键入了代码,因此错过了。除此之外,它确实打印了如上所示的结果!谢谢你的建议。它不像A、B、C、D那样简单,因为我有1000多条未知记录。对于更简单的例子,我使用了gson,上面的示例是在Jackson中实现的,但最初我在其他作业中使用gson来实现一个类来解析JSON文件。但是给我的数据文件没有很好的嵌套,我想!
Map<String, MyEntry> mapObject = mapper.readValue(jsonFile,
    new TypeReference<Map<String, MyEntry>>() {
    });

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