不幸的是,你不能拥有dynamicJava 类中的字段(与其他一些语言不同),因此您有两种选择:
- Using Map https://docs.oracle.com/javase/8/docs/api/java/util/Map.htmls
- 使用 JSON 对象(即JsonNode http://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/JsonNode.html以杰克逊为例)
假设,您有这样的数据:
{
"record": {
"jon-skeet": {
"name": "Jon Skeet",
"rep": 982706
},
"darin-dimitrov": {
"name": "Darin Dimitrov",
"rep": 762173
},
"novice-user": {
"name": "Novice User",
"rep": 766
}
}
}
创建两个类来捕获它,一个用于用户,另一个用于对象本身:
用户.java:
public class User {
private String name;
private Long rep;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Long getRep() { return rep; }
public void setRep(Long rep) { this.rep = rep; }
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", rep=" + rep +
'}';
}
}
数据.java:
public class Data {
private Map<String, User> record;
public Map<String, User> getRecord() { return record; }
public void setRecord(Map<String, User> record) { this.record = record; }
@Override
public String toString() {
return "Data{" +
"record=" + record +
'}';
}
}
现在,解析 JSON(我假设有一个data.json
文件位于类路径的根目录中):
public class App {
public static void main(String[] args) throws Exception {
final ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.readValue(App.class.getResourceAsStream("/data.json"), Data.class));
System.out.println(objectMapper.readTree(App.class.getResourceAsStream("/data.json")));
}
}
这将输出:
Data{record={jon-skeet=User{name='Jon Skeet', rep=982706}, darin-dimitrov=User{name='Darin Dimitrov', rep=762173}, novice-user=User{name='Novice User', rep=766}}}
{"record":{"jon-skeet":{"name":"Jon Skeet","rep":982706},"darin-dimitrov":{"name":"Darin Dimitrov","rep":762173},"novice-user":{"name":"Novice User","rep":766}}}
如果出现Map
您可以使用一些静态类,例如User
在这种情况下,或者通过使用完全动态Map
s of Map
s (Map<String, Map<String, ...>>
。但是,如果您发现自己使用了太多地图,请考虑切换到JsonNode
s。基本上,它们是相同的Map
并专门为高度动态的数据“发明”。不过,以后你和他们一起工作会很困难......
看一下我给你准备的完整例子here https://github.com/madhead/playgrounds/tree/master/46984314.