将嵌套的 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<Value>
那么它应该是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 对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Android Studio 中将嵌套的 JSON 反序列化为 Java
将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串
如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类