我有一个笨拙的json文件,如下所示:
{
"clientByClientId" : {
"123" : {
"clientId" : "123"
"moreFields" : "moreData"
}
"456" : {
"clientId" : "456"
"moreFields" : "moreData"
}
}
}
如您所见,此json的前两个级别是多余的。将其反序列化为Client
对象集合的最佳方法是什么?我尝试使用在线json来运行工具,但最终生成了名为“ 123”和“ 456”的类。理想情况下,我想使用Jackson,但可以接受其他解决方案。
答案 0 :(得分:3)
小注:您的JSON格式错误,因为缺少一些逗号。一旦添加了这些,就可以为您工作。
首先,您需要一个类来表示Client
:
public class Client {
private final int clientId;
private final String moreFields;
@JsonCreator
public Client(@JsonProperty("clientId") int clientId,
@JsonProperty("moreFields") String moreFields) {
this.clientId = clientId;
this.moreFields = moreFields;
}
@Override
public String toString() {
return "Client[clientId=" + clientId + ", moreFields=" + moreFields + "]";
}
}
现在,您只需要创建ObjectMapper
并遍历clientByClientId
映射的元素,即可通过以下操作完成:
ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = objectMapper.readTree(json).get("clientByClientId");
Map<Integer, Client> clientMap = objectMapper.readValue(node.traverse(),
new TypeReference<Map<Integer, Client>>() {});
System.out.println(clientMap.values());
此代码的输出是:
[Client[clientId=123, moreFields=moreData], Client[clientId=456, moreFields=moreData]]
答案 1 :(得分:-1)
我认为这样应该可以工作:
public class Body {
public ClientByClientId clientByClientId;
}
public class ClientByClientId {
public Map<String, Client> clientMap;
}
public class Client {
int clientId;
String moreFields;
}
这应将您的顶级ID用作地图中的键。