使用Jackson在android中使用相同的键但不同类型反序列化json

时间:2017-03-08 11:38:57

标签: android json jackson

我正在调用web服务,它可以有两种类型的json对象作为响应。现在有时候我得到类型为String的键profile,有时它可能具有类型为' ProfileSubObject'的相同键。那么如何管理这个案子呢?下面是我的两种类型的对象。我正在使用Jackson库来解析json。

1)

{
  "data": [
    {
      "profession": "iOS Developer",
      "thanks": {
        "count": 5
      },
      "profile": "test"
    }
  ]
}

2)。

{
  "data": [
    {
      "profession": "iOS Developer",
      "thanks": {
        "count": 5
      },
      "profile": {
        "val1":"test1",
        "val2":"test2"
      }
    }
  ]
}

密钥profile有两种不同类型的对象,基于Web服务调用。

以下是我的数据类结构。

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class DataObject {

 @JsonProperty("profession")
private String profession;

@JsonProperty("profile")
private ProfileObject profile;

@JsonProperty("thanks")
private ThanksObject thanks;

public String getProfession() {
    return profession;
}

public ThanksObject getThanks() {
    return thanks;
}
public ProfileObject getProfile() {
    return profile;
}

}

Profile类如下所示。

public class ProfileObject {

ProfileObject(){

}

ProfileObject(ProfileSubObject profileSubObject){
    this.profileSubObject= profileSubObject;

}

ProfileObject(String profile){
    this.profile= profile;
}
private  ProfileSubObject profileSubObject;
private String profile;

public ProfileSubObject getProfileSubObject() {
    return profileSubObject;
}
 }

现在,当我解析对象时,ProfileObject始终为null。我希望它基于proifle密钥数据类型进行解析。

任何人都可以帮我解析?

2 个答案:

答案 0 :(得分:3)

在构建解决方案时,我遇到了两个问题:

  1. Json结构与单个\r\n
  2. 不匹配
  3. 将同一属性反序列化为不同类型的Java对象的原始问题。
  4. 我通过构造DataObject对象解决了第一个问题,这些对象告诉Jackson所涉及的集合的泛型类型。有两个此类集合:JavaType,由一个条目Map"data" List的单个条目组成

    第二个问题,我解决了DataObject的杰克逊特征,该特征指示杰克逊为所有不识别的属性调用单一方法。为此,我将@JsonAnySetter添加到配置文件变量中,以确保Jackson确实无法识别它。现在杰克逊为两个输入jsons调用相同的方法

    这是新的@JsonIgnore类:

    DataObject

    这是我的测试方法,其中包括我提到的java类型构造:

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class DataObject
    {
        @JsonProperty("profession")
        public String profession;
    
        @JsonIgnore // forcing jackson to not recognize this property
        public ProfileObject profile;
    
        @JsonProperty("thanks")
        public ThanksObject thanks;
    
        public String getProfession() { return profession; }
        public void   setProfession(String p) { profession = p; }
    
        public ThanksObject getThanks() { return thanks; }
        public void         setThanks(ThanksObject t) { thanks = t; }
    
        public ProfileObject getProfile() { return profile; }
        public void          setProfile(ProfileObject p) { profile = p; }
    
        @JsonAnySetter
        public void setProfileFromJson(String name, Object value)
        {
            // if value is single String, call appropriate ctor 
            if (value instanceof String) {
                profile = new ProfileObject((String)value);
            }
            // if value is map, it must contain 'val1',  'val2' entries
            if (value instanceof Map) {
                ProfileSubObject profileSubObject =
                        new ProfileSubObject(((Map<String, String>)value).get("val1"), ((Map<String, String>)value).get("val2"));
                profile = new ProfileObject(profileSubObject);
            }
            // error?
        }
    }
    

答案 1 :(得分:0)

这可能有助于解析JSON,使用JsonReader。它假设您正在使用RESTful Web服务,并且已经从连接获得了HttpURLConnection和InputStream。

https://developer.android.com/reference/android/util/JsonReader.html