简体   繁体   English

将json字符串反序列化为具有jackson中字符串属性的对象

[英]Deserialize json string to object with properties which are strings in jackson

I have a json string which looks like: {"a":5, "b":"asd", "c":"{\\"d\\":3}"} This can be deserialized to an object like:我有一个 json 字符串,它看起来像: {"a":5, "b":"asd", "c":"{\\"d\\":3}"}这可以反序列化为一个对象,如:

class A {
   int a; // --> 5
   String b; // --> 'asd'
   String c; // --> '{"d":3}'
}

but i want it to be deserialized as:但我希望它被反序列化为:

class A {
   int a; // --> 5
   String b; // --> 'asd'
   MyClass c; // --> '{"d":3}'
}

where MyClass is: MyClass 在哪里:

class MyClass {
   int d; // --> 3
}

How can I achieve this in jackson during deserialization?在反序列化期间如何在 jackson 中实现这一点?

I just found out that I can use the jackson converter:我刚刚发现我可以使用杰克逊转换器:

public class MyClassConverter implements Converter<String, MyClass> {

  @Override
  public MyClass convert(String value) {
    try {
      return new ObjectMapper().readValue(value, MyClass.class);
    } catch (JsonProcessingException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  public JavaType getInputType(TypeFactory typeFactory) {
    return typeFactory.constructSimpleType(String.class, null);
  }

  @Override
  public JavaType getOutputType(TypeFactory typeFactory) {
    return typeFactory.constructSimpleType(MyClass.class, null);
  }

}

And in the Bean:在 Bean 中:

class A {
   int a; 
   String b; 

   @JsonDeserialize(converter = MyClassConverter.class)
   MyClass c; 
}

Try to do the deserialization twice:尝试进行两次反序列化:

A aObject = mapper.readValue(json,A.class);
aObject.setCObject(mapper.readValue(aObject.getC(),C.class));

class A {
    int a;
    String b;
    String c;
    C cObject;
}

class C {
    int d;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM