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

Jackson将JSON反序列化为带有map属性的pojo

徐卓
2023-03-14

有人能帮助我,我如何反序列化下面的JSON,我不能改变?我正在使用Jackson进行序列化。

{      
    "columns": [
      {
        "header": "Heading1",
      },
      {
        "header": "Heading2",
      }
    ],
    "rows": [
       "id": 1,
       "Heading1": {
          "value": "Value1"
       },
       "Heading2": {
          "value": "Value2"
       }
    ]
}

列可以具有未知数量的标题及其值,例如,“Header1”用于行数组中。

到目前为止,我有以下结构:

public class QueryResult {
   private ColumnConfig[] columns;
   private QueryResultRow[] rows;
}
public class ColumnConfig {
   private String header;
}
public class QueryResultRow {
   private int id;
   private Map<String, CellValue> values;
}
public class CellValue{
   private String value;
}

问题是当我反序列化成QueryResult时映射是空的;我了解TypeReference,但不知道如何指定TypeReference

编辑:

我的对象映射器代码如下:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String queryResultString = loadQuery(queryPath);
        QueryResult result = mapper.readValue(queryResultString, QueryResult.class);

queryResultString的内容就是上面的JSON。

共有1个答案

危卜鹰
2023-03-14

第一个问题是你的JSON无效。我想应该是这样的,

{
  "columns": [
    {
      "header": "Heading1"
    },
    {
      "header": "Heading2"
    }
  ],
  "rows": [
    {
      "id": 1,
      "Heading1": {
        "value": "Value1"
      },
      "Heading2": {
        "value": "Value2"
      }
    }
  ]
}

那么答案就很简单了。您需要更改 QueryResultRow,如下所示,

class QueryResultRow {
    private int id;
    private Map<String, CellValue> values = new HashMap<>();
    
    @JsonAnySetter
    public void addValues(String k, CellValue v) {
        values.put(k, v);
    }
}

那我想你应该可以走了。

这里是一个完整的工作示例,

public class Main {
    public static void main(String[] args) throws IOException {
        String s = "{\"columns\":[{\"header\":\"Heading1\"},{\"header\":\"Heading2\"}],\"rows\":[{\"id\":1,\"Heading1\":{\"value\":\"Value1\"},\"Heading2\":{\"value\":\"Value2\"}}]}";
        
        ObjectMapper om = new ObjectMapper();
        QueryResult queryResult = om.readValue(s, QueryResult.class);

        System.out.println(queryResult);
    }
}

@Getter
@Setter
@ToString
class QueryResult {
    private ColumnConfig[] columns;
    private QueryResultRow[] rows;
}

@Getter
@Setter
@ToString
class ColumnConfig {
    private String header;
}

@Getter
@Setter
@ToString
class QueryResultRow {
    private int id;
    private Map<String, CellValue> values = new HashMap<>();
    
    @JsonAnySetter
    public void addValues(String k, CellValue v) {
        values.put(k, v);
    }
}

@Getter
@Setter
@ToString
class CellValue{
    private String value;
}
 类似资料:
  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 我有一个POJO类,它将从JSON反序列化,JSON在Spring中作为请求体出现。此POJO类包含列表 我的JSON对象如下所示 下面是示例方法调用 我遵循了给出的建议,下面给出了反序列化程序代码

  • 我想将任意JSON反序列化为< code >映射 为了获取原语,应该为每个属性调用某种自定义客户端回调。根据键的不同,会发生某些反序列化。例如(伪代码): 在 SO 杰克逊 - 递归解析到地图中

  • 问题内容: 我正在针对返回JSON数据的第三方API进行编程,但是格式可能有点奇怪。某些属性可以是一个对象(包含一个Id属性),也可以是一个字符串(它是该对象的ID)。例如,以下两个都是有效的: 和 我正在尝试使用JSON.net将其反序列化为强类型类,但到目前为止运气还不足。我最好的主意是将其序列化为两个属性,一个为字符串,另一个为对象,并为每个属性使用自定义JsonConverter以允许变量

  • 我正在尝试使用Gson反序列化格式为“2018-05-27”的json中的date属性。在反序列化之后,我希望日期为LocalDate格式。 对于json输入: {"id": 1,"name":"test","start Date":"2018-01-01","endDate":"2018-01-05",} 我收到startDate和endDate的错误: Java语言lang.IllegalSt