【问题标题】:Jackson merge Map into json objectJackson 将 Map 合并到 json 对象中
【发布时间】:2020-01-16 16:04:20
【问题描述】:

假设我有以下对象。

class Foo {

    private String name;
    private int age;
    private Map<String, object> extra;

}

public static void main(String[] args) {
    Foo foo = new Foo();
    foo.name = "adam";
    foo.age = 25;
    foo.extra.put("hobbies", /** list of hobbies **/)
    foo.extra.put("firends", /** list of friends **/)

    // convert to json...
}

我想要以下输出...是否可以通过使用自定义序列化来做到这一点?

{
    "name": "adam",
    "age": 25,
    "hobbies": [
      {
         "name": "footbal",
         "level":  1
      }
      { 
        "name": "coding",
        "level": 2
      }
    ],
    "friends": [
      {
        "id": 1
        "name": "jack"
      },
      {
        "id": 2
        "name": "rose"
      }
    ]
}

【问题讨论】:

    标签: java spring-boot jackson


    【解决方案1】:

    我找到了实现的方法。通过使用 @JsonIgnore @JsonAnyGetter 的组合用于 Map,但如果您只有自定义对象,则只能使用 @JsonUnwrapped 来获得相同的行为。

    class Foo {
    
        private String name;
        private int age;
    
        @JsonIgnore
        private Map<String, Object> extra;
    
        @JsonAnyGetter
        public Map<String, Object> getExtra() {
           return extra;
        }
    }
    

    【讨论】:

    【解决方案2】:
    ObjectMapper objectMapper = new ObjectMapper();
    
    String json = objectMapper.writeValueAsString(foo);
    System.out.println(json);
    

    如果你想直接在输出流中写json

    ObjectMapper objectMapper = new ObjectMapper();
    
    objectMapper.writeValue(outputStream, foo);
    

    【讨论】:

      【解决方案3】:

      差不多了,hobbiesListMap,你还需要 getterssetters

      class Foo {
      
        private String name;
        private int age;
        private List<Map<String, object>> hobbies;
      
        // Getters and Setters
      
      }
      

      在主要方法中使用ObjectMapper

      public static void main(String[] args) {
      Foo foo = new Foo();
      foo.SetName("adam");
      foo.SetAge(25);
      
      Map<String,Object> map1 = Map.of("name","footbal","level",1);  //from jdk-9 you can use Map.of and List.of to create immutable objects
      List<Map<String,Object>> hobbies = List.of(map1);      
      
      foo.setHobbies(hobbies);
      
      // Use ObjectMapper to convert object to json
      
      ObjectMapper objectMapper = new ObjectMapper();
      
      String json = objectMapper.writeValueAsString(foo);
      System.out.println(json);
      
      
      }
      

      【讨论】:

      • 无论如何都要保持成员为OP,并使用自定义,序列化来制作它。
      • 不,你不能,这就是你需要做的@JongzPuangput
      • 这并不能回答 OP 使用 Map&lt;String, Map&lt;&gt;&gt; 结构的原始问题,并且对于每个嵌套地图,将其展平为顶级 json。您的建议只是为每个嵌套地图创建另一个类。
      猜你喜欢
      • 2017-05-06
      • 1970-01-01
      • 2013-11-19
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2016-03-16
      • 1970-01-01
      相关资源
      最近更新 更多