我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 props
嵌套对象,例如:
{
"id":"whatever",
"type":"Foo",
"props":
{
"name":"My Name",
"whatever":"Whatever"
}
}
字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类:
public class Base{
private String id;
private String type;
}
public class Foo extends Base{
private String name;
private String whatever;
}
如何让杰克逊读取 props
对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。
Foo的自定义反序列化程序:
public class FooDeserializer extends JsonDeserializer<Foo> {
@Override
public Foo deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String id = node.get("id").asText();
String type = node.get("type").asText();
JsonNode props = node.get("props");
String name = props.get("name").asText();
String whatever = props.get("whatever").asText();
return new Foo(id, type, name, whatever); //you need to create this constructor for Foo
}
}
主要方法示例:
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"id\":\"whatever\",\n" +
" \"type\":\"Foo\",\n" +
" \"props\":\n" +
" {\n" +
" \"name\":\"My Name\",\n" +
" \"whatever\":\"Whatever\"\n" +
" }\n" +
"}";
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Foo.class, new FooDeserializer());
mapper.registerModule(module);
Foo foo = mapper.readValue(json, Foo.class);
}
依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
如果您尝试将 props
反序列化为对象属性,则需要将相应的属性添加到 Foo
类。
例如:
public class Foo extends Base{
private Bar props;
}
public class Bar {
String name;
String something;
...getters and setters...
}
然后,您将可以通过bar.getName()
和bar.getSomething()
从JSON访问嵌套属性。
我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"
问题内容: 有人可以提供一个示例或参考,该示例或参考提供一种使用Jackson库将嵌套JAVA对象转换为JSON输出的方法的方法。我没有转换平面JAVA对象的问题。但是,JSON库显示嵌套的对象名称和类型,而不是其子对象。我几乎可以利用此处提供的相同代码http://www.mkyong.com/java/jackson-2-convert- java-object-to-from-json/ 。
但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?
问题内容: 我有一个对象,它可以是任何数量的深度,并且可以具有任何现有属性。例如: 在此我想设置(或覆盖)属性,如下所示: 属性字符串可以具有任何深度,并且值可以是任何类型/事物。 如果属性键已经存在,则不需要合并对象和数组作为值。 前面的示例将产生以下对象: 如何实现这种功能? 问题答案: 此函数使用您指定的参数应添加/更新容器中的数据。请注意,您需要跟踪架构中的哪些元素是容器,哪些是值(字符串
我有一个对象,可以是任何数量的层次深,可以有任何现有的属性。例如: 在此基础上,我希望设置(或覆盖)如下属性: 属性字符串可以有任何深度,值可以是任何类型/事物。 如果属性键已经存在,则不需要合并作为值的对象和数组。 上一个示例将生成以下对象: 如何实现这样的功能?