当前位置: 首页 > 知识库问答 >
问题:

使用Jackson Json进行反序列化,其中一个键是动态的

伊俊能
2023-03-14

我对杰克逊还很陌生。我正在尝试将以下json映射到使用Jackson进行反序列化的POJO。

 {
  "data": [
    {
      "customerName": "abc",
      "varaible_Key1": { 
        "p1": "text data",
        "p2": "textarea data",
         ........
      }
    },
   {
      "customerName": "bbc",
      "varaible_Key2": {
        "p1": "text",
        "p2": "textarea"
        ...... 
      }
    },
   {
      "customerName": "xyz",
      "varaible_Key3": {
        "p1": "xyz text",
        "p2": "xyz textarea"
        ...... 
      }
    }
   ///////more customername / variable_keys
  ]
}

我面临的问题是json中的动态/变量键。

我尝试在POJO中使用@JsonAnySetter,如下所示。

public class Foo {

    @JsonProperty("customerName")
    private String name;

    private Map<String, DataObject> properties;

    @JsonAnyGetter
    public Map<String, DataObject> getProperties() {
        return properties;
    }

    @JsonAnySetter
    public void add(String key, DataObject value) {
        properties.put(key, value);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    } 
}

其中DataObject包含p1、p2等字段。

public class DataObject {

    @JsonProperty("p1")
    private String firstValue;

    @JsonProperty("p2")
    private String secondValue;

    @JsonProperty("p3")
    private String thirdValue;

    @JsonProperty("p4")
    private String fourthValue;

    public String getFirstValue() {
        return firstValue;
    }

    public void setFirstValue(String firstValue) {
        this.firstValue = firstValue;
    }

    public String getSecondValue() {
        return secondValue;
    }

    public void setSecondValue(String secondValue) {
        this.secondValue = secondValue;
    }

    public String getThirdValue() {
        return thirdValue;
    }

    public void setThirdValue(String thirdValue) {
        this.thirdValue = thirdValue;
    }

    public String getFourthValue() {
        return fourthValue;
    }

    public void setFourthValue(String fourthValue) {
        this.fourthValue = fourthValue;
    }
}

我一直得到下面的错误。在此方面的任何帮助都将不胜感激。

com.fasterxml.jackson.databind.JsonMappingException: N/A(通过引用链:com.epic.customer.dto.DataField["data"]-

共有2个答案

段铭晨
2023-03-14

我认为你必须给它一个关于你想要回来的对象类型的提示:

ObjectMapper mapper = new ObjectMapper();
Map<String, DataObject>  test = mapper.readValue("Insert Data in here", mapper.getTypeFactory().constructMapLikeType(HashMap.class, String.class, DataObject.class));
杨良平
2023-03-14

您只需要为特定属性创建2个setter:

class Foo {

    private DataObject dataObject;

    public DataObject getDataObject() {
        return dataObject;
    }

    public void setVaraible_Key1(DataObject dataObject) {
        this.dataObject = dataObject;
    }

    public void setVaraible_Key2(DataObject dataObject) {
        this.dataObject = dataObject;
    }
}

更多用法参见此处。

 类似资料:
  • 问题内容: 我目前正在将SQL表行序列化为二进制格式,以进行有效存储。我将二进制数据序列化/反序列化为每行。我正在尝试将其升级为使用POCO,该POCO将动态生成(发射),每列一个字段。 我一直在网上搜索数小时,偶然发现了EF,T4,ExpandoObject之类的ORM /框架,但所有这些要么使用动态对象(可以动态添加/删除属性),要么在编译之前简单地生成POCO。我不能使用模板,因为在编译时表

  • 问题内容: 我有以下JSON: 当日期每次更改时,我该如何解析呢?我必须使用Jackson进行解析。 问题答案: 当您具有 动态键时 ,可以使用。键的类型和值取决于您的需要。 最简单的方法是。您需要为此: 假设您的密钥是 有效日期 ,则可以使用。 需要以下依赖项: 然后您可以拥有: 最后,您可以将动态键的值映射到Java类。让我们称之为: 然后您可以拥有:

  • 我有一个字段,它通过类序列化为ISO-8601格式。 当我收到以下JSON时, 通过将jackson-datatype-jsr310模块包含到项目中,并使用和解决了这个问题。

  • 问题内容: 我有以下课程,将其用作字典中的键: 我正在运行的测试在这里: 测试失败,因为Json.Net似乎正在使用字典键上的方法,而不是正确地序列化它们。上面测试得出的json是: 这显然是错误的。我如何使它工作? 问题答案: 这应该可以解决问题: 序列化: 通过调用,您正在序列化一个对象数组而不是字典。 反序列化: 在这里,您可以反序列化数组,然后通过调用检索字典。 我不确定输出是否满足您的期

  • 来自REST服务的json对象 使用JacksonInFiveMinutes中的代码 ObjectMapper mapper=new ObjectMapper(); Map userData=mapper.read值(webResource.queryParams(queryParams). get(String.class);, Map.class); 在哪里: 从REST服务返回json 从J

  • 问题内容: 我尝试从Newtonsoft.Json迁移到System.Text.Json。我想反序列化抽象类。Newtonsoft.Json为此具有TypeNameHandling。有什么方法可以通过.net core 3.0上的System.Text.Json反序列化抽象类? 问题答案: System.Text.Json中可以进行多态反序列化吗? 答案是肯定的 ,并 没有,这取决于你的意思是什么