1

我想休息Facebook的響應轉換成郵政類對象如下多個領域的JSON:Solr的-Java錯誤:類com.restfb.types.Post聲明命名類型

Post post = gson.fromJson(restFBResponse.toString(), Post.class); 

其中,restFBResponse是來自Facebook的帖子。但它導致到錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: class com.restfb.types.Post declares multiple JSON fields named type 

我認爲這是由於:

1) 
class Post extends NamedFacebookType{ 
    @Facebook 
    private String type; 
    //and some more class members 
} 

2) 
class NamedFacebookType extends FacebookType { 
    //few class members 
} 

3) 
class FacebookType implements Serializable { 
    @Facebook 
    private String type; 
    //and some more class members 
} 

所以,private String type;正在申報兩次,class Postclass FacebookType

1)如果這種重新聲明發生在子類中,是不是應該被覆蓋?和

2)我怎樣才能克服這個錯誤class com.restfb.types.Post declares multiple JSON fields named type

回答

1

我只是寫我自己的類不帶擴展名,未發現有其他更好的選擇..

public class MyPost{ 

    @Facebook 
    private String type; 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 
} 
0

我想GSON建議

@SerializedName( 「TYPE1」) 私人字符串類型;

這可能會解決問題。但我認爲應該有一個更清潔的解決方案..我發現這個問題已被標記爲無效,並沒有收到進一步的答覆。

0

你可以編寫自己的序列化器和解串器,以便gson序列化和反序列化Post對象。

雖然這樣做使用restfb的DefaultJsonMapper來映射後ob。

類似,

private Gson gson = new GsonBuilder() 
     .serializeNulls() 
     .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
     .registerTypeAdapter(Post.class, new PostDeserializer()) 
     .registerTypeAdapter(Post.class, new PostSerializer()) 
     .setPrettyPrinting() 
     .create(); 
private DefaultJsonMapper dMapper = new DefaultJsonMapper(); 

private class PostDeserializer implements JsonDeserializer<Post> { 
     @Override 
     public Post deserialize(JsonElement jsonElement, Type type, 
       JsonDeserializationContext context) throws JsonParseException { 
      Post post = dMapper.toJavaObject(jsonElement.toString(), Post.class); 
      return post; 
     } 
    } 

private class PostSerializer implements JsonSerializer<Post> { 
     @Override 
     public JsonElement serialize(Post post, Type type, 
       JsonSerializationContext context) { 
      return gson.toJsonTree(dMapper.toJson(post)); 
     } 
    } 
0

你不想在聲明類帖子相同的變量「類型」。當它從FacebookType擴展時,它隱含地具有變量「type」。

解決方案:

Simply remove the sentence "private String type;" from your Post class 
Replace the "private" word with "protected" in your "type" variable from your FacebookType 
+0

我們不能改變類'FacebookType'。它來自Facebook api jar。 –