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