[英]Deserialize json string to string object in java
我有一个来自 api 的 json 字符串。
有时我将address
作为对象接收,有时作为简单字符串接收。 两个例子:
case 1.(这里的address
是一个对象。)
"{\"name\":\"vikram\",\"address\":{\"city\":\"hisar\"}}";
case 2.(这里的address
是一个简单的字符串。)
"{\"name\":\"vikram\",\"address\":\"North india\"}";
我正在尝试将此 json 反序列化为Data
对象。
这是类Data
的代码
public class Data{
String name;
@JsonDeserialize(using = StringDeserializer.class)
String address;
public Data(){}
@Override
public String toString() {
return "Data{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
我能够成功反序列化第二种情况,但不能成功反序列化第一种情况,因为在第一种情况下, address
是一个 json 对象。 它抛出以下异常。
无法从 START_OBJECT 令牌反序列化
java.lang.String
实例
有没有办法使用 jackson ObjectMapper
将 json 对象映射到字符串?
我知道我可以在Data
类中使用Object
引用而不是String
,但我希望它是一个字符串。
我尝试添加@JsonDeserialize(using = StringDeserializer.class)
但这不起作用。
我认为您不能像那样切换对象。 您应该创建一个新的类型,以容纳所有可能的字段并将某些字段留空?
可能有一些注释技巧可以解决问题,但我认为您应该硬着头皮编写自己的JsonDeserializer
。
这是一个快速而肮脏的示例,可帮助您入门:
import java.io.IOException;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
public class Data {
@JsonProperty
String name;
@JsonDeserialize(using = AddressDeserializer.class)
String address;
@Override
public String toString() {
return "Data{" + "name='" + name + '\'' + ", address='" + address + '\'' + '}';
}
public static void main(String[] args) throws Exception {
System.out.println(new ObjectMapper().readValue("{\"name\":\"vikram\",\"address\":{\"city\":\"hisar\"}}", Data.class));
System.out.println(new ObjectMapper().readValue("{\"name\":\"vikram\",\"address\":\"North india\"}", Data.class));
}
}
class AddressDeserializer extends JsonDeserializer<String> {
private static final TypeReference<Map<String,Object>> MAP_STRING_OBJECT = new TypeReference<>(){ /* empty */ };
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
if (p.currentToken().isStructStart()) {
Map<String,Object> map = p.readValueAs(MAP_STRING_OBJECT);
return map.get("city").toString();
} else {
return p.readValueAs(String.class);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.