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

标记

我的JSON结构如下:

{
  "id" : "123",
  "name" : [ {
    "stuff" : [ {
      "id" : "234",
      "name" : "Bob"
    }, {
      "id" : "345",
      "name" : "Sally"
    } ]
  } ]
}

我想映射到以下数据结构:

我的界面1

@Value.Immutable
@JsonSerialize(as = ImmutableMyInterface1.class)
@JsonDeserialize(as = ImmutableMyInterface1.class)
public interface MyInterface1 {
    String id();
    @JsonDeserialize(using = MyInterface1Deserializer.class)
    List<MyInterface2> name();
}

MyInterface2

@Value.Immutable
@JsonSerialize(as = ImmutableMyInterface2.class)
@JsonDeserialize(as = ImmutableMyInterface2.class)
public interface MyInterface2 {
    @JsonDeserialize(using = StuffDeserializer.class)
    Map<String, MyInterface3> stuff();
}

MyInterface3

@Value.Immutable
@JsonSerialize(as = ImmutableMyInterface3.class)
@JsonDeserialize(as = ImmutableMyInterface3.class)
public interface MyInterface3 {
      String id();
      String name();
}

我正在使用ObjectMapperreadValue(stringWithJson,MyInterface1.class)将此JSON映射到MyInterface1,它应继续沿链向下链接到MyInterface3。当我在MyInterface2中使用列表时,该设置有效List<MyInterface3> name();

但是,我希望这是一个映射,而不是列表,理想情况下,以内部JSON中的“ id”为键。这将允许我使用以下语法获取值:MyInterface1.get(0).MyInterface2.get("id1").name();

问题是,当尝试创建自定义StuffDeserializer.class时,出现错误: Can not deserialize instance of com.foo.ImmutableMyInterface2$Json out of START_ARRAY token

尝试做时:

public Map<String, MyInterface3> deserialize(JsonParser jsonParser, DeserializationContext ctxt)
        throws IOException {

    MyInterface2 foo = Unmarshaller.OBJECT_MAPPER.readValue(jsonParser, MyInterface2.class); // error here
    ...

我认为这是因为Jackson期望“ stuff”是JSON数组的List'原因。将此JSON反序列化为使用内部JSON的值作为键的映射的最佳方法是什么?

米哈尔·福萨(Michal foksa)

我将创建一个自定义JsonDeserializer来映射id映射name到地图中:

public class StringHashMapValueDeserializer extends JsonDeserializer<HashMap<String, String>>{

    @Override
    public HashMap<String, String> deserialize(JsonParser parser, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        HashMap<String, String> ret = new HashMap<String, String>();

        ObjectCodec codec = parser.getCodec();
        TreeNode node = codec.readTree(parser);

        if (node.isArray()){
            for (JsonNode n : (ArrayNode)node){
                JsonNode id = n.get("id");
                if (id != null){
                    JsonNode name = n.get("name");
                    ret.put(id.asText(), name.asText());
                }
            }
        }
        return ret;
    }
}

然后,我将stuff使用反序列化器创建具有注释属性的简单bean

@Getter
@Setter
public class Name {

    @JsonDeserialize(using = StringHashMapValueDeserializer.class)
    Map<String, String> stuff;

    @Override
    public String toString() {
        return "Name [stuff=" + stuff + "]";
    }
}

外型:

@Getter
@Setter
public class OuterType {

    String id;
    List<Name> name;

    @Override
    public String toString() {
        return "OuterType [id=" + id + ", stuff=" + name + "]";
    }
}

反序列化:

ObjectMapper mapper = new ObjectMapper();

OuterType response;
response = mapper.readValue(json, OuterType.class);

System.out.println(response);
System.out.println(response.getName().get(0).getStuff().get("234"));

控制台输出:

OuterType [id=123, stuff=[Name [stuff={234=Bob, 345=Sally}]]]
Bob

希望能帮助到你。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何使用Jackson将Java Enums序列化和反序列化为JSON对象

来自分类Dev

使用Spring,Scala和Jackson将JSON反序列化为Map [String,SomeJavaObject]

来自分类Dev

如何使用Jackson将JSON反序列化为Map <String,Object>成员变量?

来自分类Dev

使用 Jackson 将 json 嵌入节点作为值反序列化为 Map

来自分类Dev

如何通过使用Jackson将JSON数组反序列化为单个链接列表

来自分类Dev

如何反序列化json数组,然后将普通属性反序列化为jackson中的pojo。单独的数组有效

来自分类Dev

使用PHP中的类型将嵌套对象序列化/反序列化为JSON

来自分类Dev

使用Groovy将bean序列化和反序列化为json

来自分类Dev

使用Jackson将针对JAVA类的JSON序列化和反序列化

来自分类Dev

使用Jackson XmlMapper将XML反序列化为POJO

来自分类Dev

使用Jackson XmlMapper将XML反序列化为POJO

来自分类Dev

将JSON反序列化为C#对象-不反序列化任何数据

来自分类Dev

将JSON反序列化为C#对象-不反序列化任何数据

来自分类Dev

将JSON数组反序列化为对象的Swift数组

来自分类Dev

将JSON反序列化为子类

来自分类Dev

无法将当前的json数组反序列化为type

来自分类Dev

将JSON对象反序列化为数组

来自分类Dev

将JSON对象反序列化为数组

来自分类Dev

将JSON对象反序列化为数组

来自分类Dev

将JSON数组反序列化为List

来自分类Dev

将JSON数组反序列化为C#

来自分类Dev

将JSON反序列化为类型化类

来自分类Dev

将JSON反序列化为扁平化的类

来自分类Dev

使用Newtosoft Json将Json反序列化为null

来自分类Dev

Jackson,将普通 JSON 数组反序列化为单个 Java 对象

来自分类Dev

使用动态键将JSON反序列化为字典

来自分类Dev

如何使用JavaScriptSerializer将JSON反序列化为元组

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    如何使用Jackson将Java Enums序列化和反序列化为JSON对象

  4. 4

    使用Spring,Scala和Jackson将JSON反序列化为Map [String,SomeJavaObject]

  5. 5

    如何使用Jackson将JSON反序列化为Map <String,Object>成员变量?

  6. 6

    使用 Jackson 将 json 嵌入节点作为值反序列化为 Map

  7. 7

    如何通过使用Jackson将JSON数组反序列化为单个链接列表

  8. 8

    如何反序列化json数组,然后将普通属性反序列化为jackson中的pojo。单独的数组有效

  9. 9

    使用PHP中的类型将嵌套对象序列化/反序列化为JSON

  10. 10

    使用Groovy将bean序列化和反序列化为json

  11. 11

    使用Jackson将针对JAVA类的JSON序列化和反序列化

  12. 12

    使用Jackson XmlMapper将XML反序列化为POJO

  13. 13

    使用Jackson XmlMapper将XML反序列化为POJO

  14. 14

    将JSON反序列化为C#对象-不反序列化任何数据

  15. 15

    将JSON反序列化为C#对象-不反序列化任何数据

  16. 16

    将JSON数组反序列化为对象的Swift数组

  17. 17

    将JSON反序列化为子类

  18. 18

    无法将当前的json数组反序列化为type

  19. 19

    将JSON对象反序列化为数组

  20. 20

    将JSON对象反序列化为数组

  21. 21

    将JSON对象反序列化为数组

  22. 22

    将JSON数组反序列化为List

  23. 23

    将JSON数组反序列化为C#

  24. 24

    将JSON反序列化为类型化类

  25. 25

    将JSON反序列化为扁平化的类

  26. 26

    使用Newtosoft Json将Json反序列化为null

  27. 27

    Jackson,将普通 JSON 数组反序列化为单个 Java 对象

  28. 28

    使用动态键将JSON反序列化为字典

  29. 29

    如何使用JavaScriptSerializer将JSON反序列化为元组

热门标签

归档