好的,首先這裏是從我的web服務返回的JSON。我試圖在我的Android ContentProvider中的ResponseHandler中進行異步查詢後將其反序列化爲pojos。傑克遜JSON反序列化MongoDB ObjectId
{"exampleList" : [{
"locationId" : "00001" ,
"owners" : [
{
"paidID" : { "$oid" : "50a9c951300493f64fbffdb6"} ,
"userID" : { "$oid" : "50a9c951300493f64fbffdb6"}
} ,
{
"paidID" : { "$oid" : "50a9c951300493f64fbffdb7"} ,
"userID" : { "$oid" : "50a9c951300493f64fbffdb7"}
}
]
}]}
起初,我很困惑,我所看到的問題,因爲我用的是相同的傑克遜標註豆我的web服務,我在我的Android應用程序做的 - 但後來我意識到owners
對象從來沒有發送過樣本JSON到我的Web服務(它跳過我的Web服務中的POJO,並通過DAO中的原子更新添加到mongoDB中的文檔中)。
好吧。截至目前,傑克遜不必處理owners
對象,而現在它是被窒息在其上,即:
JsonMappingException
:在[字符無法反序列化的實例java.lang.String
出START_OBJECT
令牌位置,你可以找到"userID"
和"paidID"
] 通過參考鏈[路徑到我的傑克遜豆含有業主類]
我的傑克遜Bean有一個包裝,這是「exampleList」是怎麼一回事:
public class Examples extends HashMap<String, ArrayList<Example>> {
}
然後實際Example
類:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Example implements Comparable<Example> {
@ObjectId @Id
private String id;
@JsonProperty(Constants.Example.location)
private String location;
@JsonProperty(Constants.Example.OWNERS)
private List<Owners> owners;
public int compareTo(Example _o) {
return getId().compareTo(_o.getId());
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public List<Example.Owners> getOwners() {
return owners;
}
public void setOwners(List<Example.Owners> owners) {
this.owners = owners;
}
public Example() {
}
@JsonCreator
public Example(@Id @ObjectId String id) {
this.id = id;
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Owners implements Comparable<Owners> {
@JsonProperty(Constants.Example.USERID)
private String userID;
@JsonProperty(Constants.Example.PAIDID)
private String paidID;
public Owners() {
}
public int compareTo(Owners _o) {
return getUserID().compareTo(_o.getUserID());
}
@ObjectId
public String getUserID() {
return userID;
}
@ObjectId
public void setUserID(String userID) {
this.userID = userID;
}
@ObjectId
public String getPaidID() {
return paidID;
}
@ObjectId
public void setPaidID(String paidID) {
this.paidID = paidID;
}
}
}
最後,在對ResponseHandler的代碼中,這是所有失敗(2號線生產的JsonMappingException):
objectMapper = MongoJacksonMapperModule.configure(objectMapper);
mExamples = objectMapper.readValue(jsonParser, Examples.class);
我有一種感覺,問題是傑克遜仍然不知道如何映射那些是mongoDB ObjectIds的$oid
。 MongoJacksonMapper庫應該可以通過提供@ObjectId
註釋和一種配置ObjectMapper來使用該庫的方法來提供幫助,但它仍然不起作用。出於某種原因,它仍然在尋找userID或paidID作爲字符串,而不是ObjectId。有任何想法嗎?
問題是關於反序列化,系列化沒有。這個答案應該被下調。 – Arny