繁体   English   中英

如何使用 Jackson 将此动态键 JSON 反序列化为 Java 自定义 Pojo

[英]How to deserialize this dynamic keys JSON to Java custom Pojo using Jackson

我有一个非常复杂的 json 字符串,我想将其反序列化为自定义 Java Pojo,但我不太确定该怎么做。

这是 json:

{
   "A": {
          "view": {

                   "1": ["stringA", "stringB"],
                   "2": ["stringA", "stringB"],
                   "3": ["stringA", "stringB"]
                  },
           "list": ["stringA", "StringB"]
         },
   "B": {
         "view": {

                   "1": ["stringA", "stringB"],
                   "2": ["stringA", "stringB"],
                   "3": ["stringA", "stringB"]
                  },
           "list": ["stringA", "StringB"]
         }
}

请注意,与list相比, view key 有一个额外的嵌套。

任何帮助都会很棒!

编辑2:

让我们尝试将我的问题简化为更简单的 JSON,如下所示:

{
   "view": {

              "1": ["stringA", "stringB"],
              "2": ["stringA", "stringB"],
              "3": ["stringA", "stringB"]
           },
   "list": ["stringC", "stringD"]
}

这是我的 Pojo:

public class Model {

   private final Map<String, List<String> modelView;
   private final List<String> modelList;

   @JsonCreator
   public ModelView(@JsonProperty("view") Map<String, List<String>> 
   modelView, @JsonProperty("list") List<String> modelList) {
     this.modelView = modelView;
     this.modelList = modelList;
   }

   public Map<String, List<String>> getModelView() {
     return modelView;
   }
   
   public List<String> getModelList() {
     return modelList;
   }
}

和我的测试代码:

 @Test
  public void testSerialization() throws Exception {

    try {

      JSONObject json = new JSONObject(json1Str());

      ObjectMapper mapper = new ObjectMapper();

      Model model = mapper.readValue(json.toString(), Model.class);

      System.out.println(model.getModelView());

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

它不起作用......对此有什么想法吗?

要使用动态密钥反序列化 JSON,您可以使用 Jackson 库中的@JsonAnySetter注释。 它会将您的键添加到映射到 Java Map 的值中。

public class DyanamicJson {

    private Map<String, Object> dynamicKeys = new HashMap<>();
    
    @JsonAnySetter
    public void setUnknownFields(String name, Object value) {
        dynamicKeys.put(name, value);
    }
    
    public Map<String, Object> getFieldsMap() {
        return dynamicKeys;
    }

}

这是最后的 model class,希望这能帮助别人......

public class LangModel {

   private final Map<String, Model> langModel;

   @JsonCreator
   public LangMode(Map<String, Model> langModel) {
      this.langModel = langModel;
   }

   public LangModel getLangModel() {
      return langModel;
   }

   public static class Model {

     private final Map<String, List<String> modelView;
     private final List<String> modelList;

     @JsonCreator
     public ModelView(@JsonProperty("view") Map<String, List<String>> 
     modelView, @JsonProperty("list") List<String> modelList) {
       this.modelView = modelView;
       this.modelList = modelList;
     }

     public Map<String, List<String>> getModelView() {
       return modelView;
     }
   
     public List<String> getModelList() {
       return modelList;
     }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM