2016-10-07 41 views
1

對象我有成功的JSON模型的一些這個GSON:轉換JSON要與無知

{ 
    data: { 
     ..... 
    } 
} 

所以我創建模型:

Class Model{ 
    public Data data; 
} 

和我用 new Gson().fromJson(Model.class)在轉換目的。它工作正常。現在我的問題,當我在相同的API得到錯誤開始和JSON得到改變

{ 
    message: { 
     ..... 
    } 
} 

我想用相同的模型以JSON被序列化。

Class Model{ 
    public Data data; 
    public Massage message; 
} 

但它給了我以下情況除外:Expected a string but was BEGIN_OBJECT at line 1 column 13

+0

這裏沒有足夠的信息。我懷疑你的「按摩」類和相關數據可能存在問題。有些東西是不正確的,因爲該字段被稱爲'm',但在json中被稱爲'message',但這不會導致它自己的「期望的字符串」。 – weston

+0

@weston指出,你的模型變量名必須與json對象名相同,在這種情況下,你的「Massage m」應該是「Massage message」。我相信問題出在你的按摩對象裏面,在某個地方,你有一個字段作爲字符串,但參數的類型是一個對象。 – Ricardo

+0

變量m只是例如。我改變了問題。 –

回答

0

只是配置和使用ObjectMapper從傑克遜的lib:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.3</version> 
</dependency> 

映射器應定義爲

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

請參閱全演示範例

public class Demo { 

    public static void main(String[] args) throws IOException { 

     String jsonData = "{" + 
       " \"data\": {" + 
       " }" + 
       "}"; 
     String jsonMessage = "{" + 
       " \"message\": {" + 
       " }" + 
       "}"; 

     ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

     Model modelData = mapper.readValue(jsonData, Model.class); 
     Model modelMessage = mapper.readValue(jsonMessage, Model.class); 


     System.out.println(modelData); 
     System.out.println(modelMessage); 


    } 
} 


class Model { 

    private Data data; 
    private Message message; 

    @Override 
    public String toString() { 
     return "Model{" + 
       "data=" + data + 
       ", message=" + message + 
       '}'; 
    } 

    public Data getData() { 
     return data; 
    } 

    public void setData(Data data) { 
     this.data = data; 
    } 

    public Message getMessage() { 
     return message; 
    } 

    public void setMessage(Message message) { 
     this.message = message; 
    } 

    private static class Data {} 
    private static class Message {} 
} 

順便說一句,ObjectMapper是線程安全的,所以你可以定義一個常量,在你每次閱讀Json時不創建它。

更多的信息可以在這裏找到:http://fasterxml.github.io/jackson-databind/javadoc/2.8/com/fasterxml/jackson/databind/ObjectMapper.html

+0

問題是關於gson,而不是傑克遜。 – weston

+0

@weston如果你想得到一個只與Gson lib相關的答案,你必須在頭文件中定義並在你想要使用Gson lib修復它的問題中寫下它。目前還沒有這樣的信息,所以請添加它以避免浪費別人的時間。 – eGoLai

+0

那麼這個問題是相當清楚的,至於標題,不,這是標籤的用途。請閱讀http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles – weston