将嵌套的 JSON 字符串反序列化为 Java 对象

Posted

技术标签:

【中文标题】将嵌套的 JSON 字符串反序列化为 Java 对象【英文标题】:Deserialize nested JSON String to Java Object 【发布时间】:2022-01-20 06:58:55 【问题描述】:

我的 JSON 看起来像这样,让我们​​说问题


    "type": "String",
    "value": "\"text\":\"Question\",\"type\":\"predefined\",\"parameter\":\"param1\",\"answers\":[\"Answer1\",\"Answer2\",\"Answer3\",\"Answear4\"]",
    "valueInfo": 

我想用 Jackson 将其解析为 Question objecti,其中包含有关问题的详细信息(如文本、类型和答案列表)

我尝试创建类问题和价值

public class AbasQuestion 
        @JsonProperty("type")
        String type;
        @JsonProperty("value")
        Value value;
        JsonNode valueInfo; 
 
public class Value 

    String text;
    String type;
    String parameter;
    List<String> answers;

并将字符串解析给他们

Question question = objectMapper.readValue(jsonQuestion, Question.class);

但我仍然得到错误

Can not instantiate value of type [simple type, class Value] from String value; no single-String constructor/factory method (through reference chain: Question["value"])

我知道 Value 是 String ,我必须将它转换为 Value 对象,但是如何以及在哪里?在 Value 构造函数内部还是在 Question setter 内部?到杰​​克逊可以做地图。

【问题讨论】:

我与 Jackson 合作得不够多,因为我觉得它对我来说不够直观,但 JSON Path 库对我来说确实很神奇。此外,在将在线工具插入代码之前,您可以尝试在在线工具中进行的任何查询。 【参考方案1】:

您需要一个自定义的字符串到值的转换器。这是一个使用 Spring boot 作为框架的示例。

@JsonDeserialize(converter = StringToValueConverter.class)
Value value;

如果你有一个Value 的容器,例如List&lt;Value&gt; 那么它应该是contentConverter 而不是converter

那么你的转换器看起来像这样。

@Component
public class StringToValueConverter extends StdConverter<String, Value> 

  final ObjectMapper objectMapper;

  public StringToValueConverter(ObjectMapper objectMapper) 
    this.objectMapper = objectMapper;
  

  @Override
  public Value convert(String value) 
    try 
      return this.objectMapper.readValue(value, Value.class);
     catch (IOException e) 
      throw new RuntimeException(e);
    
  


如果需要,您可以将简单的 RuntimeException 包装器替换为提供更多信息的内容。

Value 类的成员要么需要公开,要么更好地提供 Jackson 可以使用的 getter/setter,否则所有成员在反序列化后将显示为 null

【讨论】:

只是想知道:如何使其泛型支持参数化类型,以便反序列化器可以重用于其他类型的字段?

以上是关于将嵌套的 JSON 字符串反序列化为 Java 对象的主要内容,如果未能解决你的问题,请参考以下文章

将JSON对象反序列化为嵌套的C#对象

在 Android Studio 中将嵌套的 JSON 反序列化为 Java

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串

如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类

如何将具有嵌套属性的 JSON 对象反序列化为 Symfony 实体?

Json.NET:将嵌套数组反序列化为强类型对象