Jackson 开始反序列化时跳过两级

3

我有一个构造怪异的JSON文件,就像这样:

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

正如您所看到的,这个json的前两个级别是多余的。将其反序列化为Client对象集合的最佳方法是什么?我尝试使用在线json to pojo工具,但它们生成的类名为"123"和"456"。理想情况下,我想使用Jackson,但也愿意尝试其他解决方案。


我看到你的 JSON 字符串唯一的缺陷是缺少逗号。你能再检查一下,把逗号放在正确的位置吗? - Gautam
2个回答

4

小提示:你的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
太好了,谢谢!是的,我关于逗号的错误 - 太多使用yaml已经宠坏了我。 - Steve

-1

我认为这样应该可以工作:

   public class Body {
    public ClientByClientId clientByClientId;
}

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

public class Client {
    int clientId;
    String moreFields;
}

这将把您的顶级 ID 放入地图中作为键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接