Java Jackson开始反序列化两个级别

Java Jackson开始反序列化两个级别,java,jackson,Java,Jackson,我有一个结构笨拙的json文件,如下所示: { "clientByClientId" : { "123" : { "clientId" : "123" "moreFields" : "moreData" } "456" : { "clientId" : "456" "moreFields" : "moreData" } } } 如您所见,此json的前两个级别是多余的。将其反序列化为Client对象集合的最佳方法是什么?我尝试使用在线j

我有一个结构笨拙的json文件,如下所示:

{
"clientByClientId" : {
  "123" : {
    "clientId" : "123"
     "moreFields" : "moreData"
   }
  "456" : {
    "clientId" : "456"
     "moreFields" : "moreData"
   }
 }
}

如您所见,此json的前两个级别是多余的。将其反序列化为
Client
对象集合的最佳方法是什么?我尝试使用在线json到pojo工具,但它们最终生成了名为“123”和“456”的类。理想情况下,我希望使用Jackson,但我对其他解决方案持开放态度。

我认为类似的解决方案应该可行:

   public class Body {
    public ClientByClientId clientByClientId;
}

public class ClientByClientId {
    public Map<String, Client> clientMap;
}

public class Client {
    int clientId;
    String moreFields;
}
公共类主体{
公共ClientByClientId ClientByClientId;
}
公共类ClientByClientId{
公共地图客户端地图;
}
公共类客户端{
int clientId;
字符串字段;
}

这应该将您的顶级ID作为地图中的键

小提示:您的JSON格式不正确,因为它缺少几个逗号。一旦这些都被添加,那么这将为您工作

首先,您需要一个类来表示
客户机

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());

我在json字符串中看到的唯一缺陷是缺少逗号。你能用正确的逗号再次检查一下吗?这太完美了,谢谢!是的,我在逗号上犯了一个错误——太多地使用yaml已经把我惯坏了。
[Client[clientId=123, moreFields=moreData], Client[clientId=456, moreFields=moreData]]