2014-12-26 69 views
3

我最近開始使用Retrofit。我對此不甚瞭解。我GOOGLE了這個問題,沒有答案套件我的問題。JSON解析與改造

這是這是訂閱

public class Feed { 
    public List<Results> results; 
    class Results{ 
     String description_eng,img_url,title_eng; 
    } 
} 

這是接口

public interface GetApi { 
    @GET("/api.json") 
    public void getData(Callback<List<Feed>> response); 
} 

json_illegal_syntax Exception JSON響應

{ 
"results": [ 
{ 
"description_eng": "This is second time testing", 
"img_url": "-", 
"title_eng": "Second test" 
}, 
{ 
"description_eng": "Hello 1 2 3, I am testing.", 
"img_url": "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xpa1/t31.0-8/s720x720/10838273_816509855058935_6428556113200361121_o.jpg", 
"title_eng": "Test" 
} 
] 
} 

+0

設法使「結果」類的靜態,爲你設計的,它作爲一個內部類。 –

+0

不工作的兄弟。 –

+0

好的。你有沒有嘗試用http://jsonformatter.curiousconcept.com這樣的東西解析響應JSON?如果這是一個「非法語法」錯誤,它應該告訴你。 –

回答

3

這是我如何解決了這個問題。

Feed.class

public class Feed{ 
    private List<Result> results; 

    public Feed(){ 

    } 
    public List<Result> getFeed(){ 
     return this.results; 
    } 
    public void setFeed(List<Result> results) { 
     this.results = results; 
    } 
} 

Result.class

public class Result{ 
    private String description_eng; 
    private String img_url; 
    private String title_eng; 

    public Result(){} 
    //getters and setters 
    } 

GetApi.class

public interface GetApi { 
    @GET("/api.json") 
    public void getData(Callback<Feed> response); 
} 

謝謝回答兄弟。 :D

+0

我有一個類似的問題:http://stackoverflow.com/questions/39310585/cannot-parse-json-response-object/39314214#39314214 – tccpg288

+0

空構造函數解決它嗎? – tccpg288

1

Retrofit默認使用Gson將HTTP正文轉換爲JSON或從JSON轉換HTTP正文。如果您想要指定與Gson默認值不同的行爲(例如命名策略,日期格式,自定義類型),請在構建RestAdapter時提供具有所需行爲的新Gson實例。

Gson無法自動反序列化純內部類,因爲它們的無參數構造函數也需要對包含在反序列化時不可用的對象的引用。您可以通過使內部類爲靜態或通過爲其提供自定義InstanceCreator來解決此問題。這裏是一個例子:

public class A { 
    public String a; 

    class B { 

    public String b; 

    public B() { 
     // No args constructor for B 
    } 
    } 
} 

注意:上述B類不能(默認情況下)與Gson序列化。

你應該閱讀更多關於GSON library

1

@Ye Min Htut實際上,更好的做法是用泛型編寫Feed類。

public class FeedList<T>{ 
    private List<T> feeds; 
    public Feed() { 

    } 
    public List<T> getFeed(){ 
     return this.feeds; 
    } 
    public void setFeed(List<T> results) { 
     this.feeds = feeds; 
    } 
} 

,如果有隻有一個對象類似的東西,比你可以刪除列表部分和獲取/設置單個對象。

現在您可以撥打FeedList<Result>或與您想要的任何對象。

GetApi.class

public interface GetApi { 
@GET("/api.json") 
    public void getData(Callback<FeedList<Result>> response); 
}