1

次のように、rest-facebook 応答を Post クラス オブジェクトに変換しようとしています。

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

restFBResponseFacebook からの投稿です。しかし、それはエラーになります:

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;は と で 2 回宣言されclass Postていclass FacebookTypeます。

1) そのような再宣言がサブクラスで発生した場合、それをオーバーライドすべきではありませんか? と

2) どうすればこのエラーを克服できますclass com.restfb.types.Post declares multiple JSON fields named typeか?

4

4 に答える 4

1

拡張機能なしで独自のクラスを作成しましたが、他に良いオプションが見つかりませんでした..

public class MyPost{

    @Facebook
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}
于 2013-08-29T08:49:48.383 に答える
0

クラス Post で同じ変数「type」を宣言したくありません。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
于 2013-08-29T08:37:04.783 に答える
0

gson 用に独自のシリアライザーとデシリアライザーを記述して、オブジェクトをシリアライズおよびデシリアライズすることができPostます。

そうしている間に、restfb を使用してDefaultJsonMapperPost オブジェクトをマップします。

何かのようなもの、

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));
        }
    }
于 2013-06-20T07:20:09.617 に答える