在 Jackson 中反序列化 JSON,其中 key 是一个值

旺扎
{
  {
      "1234": {
          "name": "bob"
      }
  },
  {
      "5678": {
          "name": "dan"
      }
  }
}

我有一个表示名称的类(和其他字段,我只是简单地解决了这个问题)。但是每个元素都以人的 id 为键。

我尝试了几件事,包括:

class Name {
     String Name;
     //getter and setter
}
class NameId {
     String id;
     Name name;
     //getter and setters
}

//json is the string containing of the above json
ArrayList<NameId> map = objectMapper.readValue(json, ArrayList.class);
for (Object m : map) {
    LinkedHashMap<String, NameId> l = (LinkedHashMap)m;
            Map<String, NameId> value = (Map<String, NameId>) l;

            //System.out.println(l);
            //System.out.println(value);
            for (Object key : value.keySet()) {
                System.out.println("key: " + key);
                System.out.println("obj: " + value.get(key));

                NameId nameId = (NameId)value.get(key);

            }
}

我遇到的问题是它不允许转换为 NameId。我得到的错误是:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to NameId

有关正确解析此类 json 字符串的最佳方法的任何想法?

威廉伯纳姆

您的 json 格式错误。您需要在它周围使用方括号,否则它不会被视为 json 数组。如果您的 json 看起来像(例如)

[
    {
        "1234" : {
            "name" : "dan"
        }
    },
    {
        "5678" : {
            "name" : "mike"
        }
    }
]

您可以为对象映射器编写自定义反序列化器。请参阅下面的工作示例:

public static void main(String... args) throws Exception {
    String testJson = "[{ \"1234\" : { \"name\" : \"dan\" } },{ \"5678\" : { \"name\" : \"mike\" } }]";

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(NameId.class, new MyDeserializer());
    mapper.registerModule(module);
    ArrayList<NameId> map = mapper.readValue(testJson.getBytes(), new TypeReference<List<NameId>>() {
    });
    for (NameId m : map) {
        System.out.println(m.id);
        System.out.println(m.name.name);
        System.out.println("----");
    }
}


@JsonDeserialize(contentUsing = MyDeserializer.class)
static class NameId {
     String id;
     Name name;
     //getter and setters
    }

static class Name {
     String name;
     //getter and setter
}

static class MyDeserializer extends JsonDeserializer<NameId> {

    @Override
    public NameId deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);
        Map.Entry<String, JsonNode> nodeData = node.fields().next();
        String id = nodeData.getKey();
        String name = nodeData.getValue().get("name").asText();
        Name nameObj = new Name();
        nameObj.name = name;
        NameId nameIdObj = new NameId();
        nameIdObj.name = nameObj;
        nameIdObj.id = id;
        return nameIdObj;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Jackson在反序列化JSON数组中反序列化JSON数组

使用Jackson将Java中的JSON反序列化

Jackson JSON反序列化:每行中的数组元素

在jackson中反序列化bson long原始json

Jackson从JSON中的变量类型反序列化

Jackson Json反序列化视图

JSON Jackson将多个密钥反序列化到同一字段中

Jackson对嵌套对象进行反序列化,其中一个引用另一个。未解决的ForwardReference

无法使用 jackson 反序列化包含 2 个具有相同 ID 的对象的 Json

使用 Jackson ObjectMapper 双向一对多反序列化 JSON 对象

用Jackson将反序列化的JSON转换为多态类型-一个完整的示例给我一个编译错误

用Jackson将多个json键反序列化为一个字段

在 C# 中反序列化 JSON 值数组

使用数组中的空值反序列化JSON

使用Jackson将反序列化JSON数组反序列化为Map

使用Jackson将反序列化JSON数组反序列化为单个Java对象

如何使用Jackson将反序列化的JSON反序列化为忽略键的对象?

用Jackson对多态类反序列化JSON

用Jackson和@JsonCreator反序列化JSON

用Jackson进行JSON反序列化

Jackson Json将对象反序列化到列表

配置Jackson以反序列化单引号(无效)的JSON

使用Jackson自定义JSON反序列化

带有根元素的Jackson JSON反序列化

使用Scala Jackson进行JSON反序列化?

Jackson用泛型反序列化JSON

使用 jackson 进行 JSON 反序列化

使用 Jackson 从 JSON 反序列化 Scala 地图字段

用Jackson进行JSON文件的多态反序列化