繁体   English   中英

在java中将json字符串反序列化为字符串对象

[英]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.

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