2013-09-27 159 views
2

我有一個非常簡單的POJO,我寫入MongoDB。然後它返回包含_id屬性作爲$ oid對象的JSON。我想寫入我的POJO,但迄今爲止失敗了。我看到很多人與它鬥爭並提出不同的解決方案,但我還沒有得到任何解決方案。可能是因爲沒有人提供確切的細節,他們實際使用的庫。有codehaus.jackson。*有com.fastxml.jackson。 ,jongo,org.mongo。,com.mongo *等

我的目標是這樣的:

package com.blueplanetsoftware.metrics.rest; 

import javax.persistence.Id; 

import com.fasterxml.jackson.annotation.JsonProperty; 

public class MongoObject 
{ 
    @JsonProperty("_id") 
    private String _id; 

    @JsonProperty("userID") 
    private String userID; 
    @JsonProperty("appID") 
    private String appID; 
    @JsonProperty("message") 
    private String message = ""; 
    @JsonProperty("session") 
    private String session; 

    public MongoObject() {} 

    /** 
    * @return the id 
    */ 
    @Id 
    @JsonProperty("_id") 
    public String getId() 
    { 
     return _id; 
    } 

    /** 
    * @param id the id to set 
    */ 
    @Id 
    @JsonProperty("_id") 
    public void setId(String id) 
    { 
     this._id = id; 
    } 
} 

,我找回了JSON看起來是這樣的:

{ 
    "userID" : "aap" , 
    "appID" : "noot" , 
    "message" : "JSON" , 
    "session" : "ea944555b5ea8ea6" , 
    "_id" : { "$oid" : "5245f1063004348555e54815"} 
} 

當我嘗試反序列化JSON到我這個代碼類:

com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); 
MongoObject o = mapper.readValue(response, MongoObject.class); 

它給了我一個例外:

java.lang.AssertionError: Can not deserialize instance of java.lang.String out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 93] (through reference chain: com.blueplanetsoftware.metrics.rest.MongoObject["_id"]) 

那麼如何讓_id/$ oid字符串進入我的_id屬性?我很驚訝,這不是一個簡單的方法來做到這一點。至少我至今還沒有找到任何東西。

回答

4

你試過了嗎?

@ObjectId @Id 
private String id; 

我寫了一個測試,看看這方面的工作:

@Test 
public void shouldConvertJSONStringIntoPojo() throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    MongoObject actual = mapper.readValue("{\n" + 
            "  \"userID\" : \"aap\" ,\n" + 
            "  \"appID\" : \"noot\" ,\n" + 
            "  \"message\" : \"JSON\" ,\n" + 
            "  \"session\" : \"ea944555b5ea8ea6\" ,\n" + 
            "  \"_id\" : { \"$oid\" : \"5245f1063004348555e54815\"}\n" + 
            "}", MongoObject.class); 

    assertThat(actual, equalTo(new MongoObject("5245f1063004348555e54815", "aap", "noot", "JSON", "ea944555b5ea8ea6"))); 
} 

我使用這個文庫:

import com.fasterxml.jackson.databind.ObjectMapper; (jackson-databind-2.1.4,jar) 
import org.junit.Test;        (junit-4.11.jar) 
import static org.hamcrest.CoreMatchers.equalTo; (hamcrest-core-1.3.jar) 
import static org.junit.Assert.assertThat;   (junit-4.11.jar) 

唯一的變化,我給你做在問題中發佈的MongoObject添加了一個構造函數,該構造函數將所有字段和hashCode等於& toString(這樣我就可以測試它)。如果我運行與MongoObject該測試,然後我得到了同樣的錯誤,你:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token 
at [Source: [email protected]; line: 5, column: 40] (through reference chain: MongoObject["_id"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:599) 

但是,如果我做一個小的變化,以您的MongoObject:

public class MongoObject 
{ 
    @JsonProperty("_id") 
    @org.jongo.marshall.jackson.oid.ObjectId 
    private String _id; 

    @JsonProperty("userID") 
    private String userID; 
    @JsonProperty("appID") 
    private String appID; 
    @JsonProperty("message") 
    private String message; 
    @JsonProperty("session") 
    private String session; 

    public MongoObject() {} 

//... insert constructors, hashCode, equals and toString just for testing... 
} 

,則測試通過。

+0

我想我試過了。但是,@ObjectId來自MongoJack庫。儘管MongoJack似乎可以直接將MongoDB查詢轉換爲POJO,但我無法找到如何使用MongoJack將JSON字符串轉換爲POJO,反之亦然。由於我正在創建一個平臺和語言不可知的REST服務,因此我的REST代碼需要返回JSON字符串。在客戶端,使用Java時,我想將這些字符串轉換爲POJO。這就是_id:{$ 0id:「abc」}結構給出的麻煩。我在這裏錯過了一些微不足道的東西嗎? –

+0

我認爲我使用的是Jongo,它非常適合查詢。 MongoJack和Jongo不一樣。在MongoJack中,你可以給JacksonDBCollection POJO來保存,但我想這仍然不能回答你的問題,因爲你仍然需要獲得POJO。在我的項目中,傑克遜數據綁定似乎正在關注事物的這一方面。如果有幫助,我會用我寫的junit測試更新我的答案。 – Trisha

+0

謝謝Trisha,確實有效。我覺得非常好奇,因爲它沒有@ org.jongo.marshall.jackson.oid.ObjectId註解不起作用。儘管這是對Jongo的唯一參考。這是否意味着com.fasterxml.jackson.databind.ObjectMapper知道Jongo註釋?這個解決方案有一些神奇的東西,沒有任何意義。但至少它解決了我的問題,我會看看我以後能否理解它。 –