我正在调用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
密钥数据类型进行解析。
任何人都可以帮我解析?
答案 0 :(得分:3)
在构建解决方案时,我遇到了两个问题:
\r\n
我通过构造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