很遗憾,Java 类中不能有 动态 字段(与其他一些语言不同),因此您有两种选择:
- 使用
Maps
- 使用 JSON 对象(即
JsonNode 在 Jackson 的情况下)
假设,你有这样的数据:
{
"record": {
"jon-skeet": {
"name": "Jon Skeet",
"rep": 982706
},
"darin-dimitrov": {
"name": "Darin Dimitrov",
"rep": 762173
},
"novice-user": {
"name": "Novice User",
"rep": 766
}
}
}
创建两个类来捕获它,一个用于用户,另一个用于对象本身:
User.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 +
'}';
}
}
Data.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,或者使用Maps of Maps (Map<String, Map<String, ...>>) 完全动态化。但是,如果您发现自己使用太多地图,考虑切换到JsonNodes。基本上,它们与Map 相同,并且是专门为高动态数据“发明”的。不过,以后你会很难使用它们...
看一个完整的例子,我已经为你准备好了here。