【问题标题】:How to serialize using gson with @SerializedName annotation?如何使用带有 @SerializedName 注释的 gson 进行序列化?
【发布时间】:2013-12-27 10:50:07
【问题描述】:

这是我第一个使用 Gson 进行序列化的方法。 我收到 Facebook 对我的 android 应用程序的响应,如下所示:

     Result: {
        Response:  responseCode: 200, 
        graphObject: GraphObject{graphObjectClass=GraphObject, 
        state={
           "data":[{"pic_square":"https:\/\/fbcdn-profile-a.akamaihd.net\/xxx.jpg",
           "uid":"1020272xxxx852765","name":"Mister X"}
        }, 
        error: null, isFromCache:false
      }]}

我创建了新班级,但我不知道如何填写...

import java.io.Serializable;
import java.util.Arrays;
import com.google.gson.annotations.SerializedName;
public class FacebookResponse  implements Serializable{

private static final long serialVersionUID = -104137709256566564L;

@SerializedName("data")
private FacebookResponse[] data;


@Override
public String toString() {
return "FacebookResponse [data=" + Arrays.toString(data) + "]";
}    

}

在我的主要片段中:

 Request request = new Request(session,
                "/fql",                         
                params,                         
                HttpMethod.GET,                 
                new Request.Callback(){         
                    public void onCompleted(Response response) {
                        Log.i(TAG, "Result: " + response.toString());
                        final GsonBuilder builder = new GsonBuilder();
                        final Gson gson = builder.create();
                        FacebookResponse facebookResponse= gson.fromJson(response.toString(),FacebookResponse.class);
                    } 
            }); 
            Request.executeBatchAsync(request);      

非常感谢您的帮助

【问题讨论】:

    标签: java android annotations facebook-fql gson


    【解决方案1】:

    解决办法

    String fqlQuery = "SELECT uid, name, pic_square FROM user WHERE uid IN "
                + "(SELECT uid2 FROM friend WHERE uid1 = me() )";
        Bundle params = new Bundle();
        params.putString("q", fqlQuery);
        Session session = Session.getActiveSession();
        Request request = new Request(session, "/fql", params, HttpMethod.GET,
                new Request.Callback() {
                    public void onCompleted(Response response) {
                        Log.i(TAG, "Result: " + response.toString());
    
                        try {
                            final GsonBuilder builder = new GsonBuilder();
                            final Gson gson = builder.create();
                            **//here i get Data values** 
                            JSONObject data = response.getGraphObject()
                                    .getInnerJSONObject();
                            FacebookResponses facebookResponses = gson
                                    .fromJson(data.toString(),
                                            FacebookResponses.class);
    
                            Intent i = new Intent(getActivity()
                                    .getApplicationContext(),
                                    FacebookUsersImages.class);
                            i.putExtra("facebookResponses", facebookResponses);
                            startActivity(i);
    
                            // Log.i(TAG, "Result finale : " +
                            // facebookResponses.toString());
                        } catch (JsonSyntaxException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                });
        Request.executeBatchAsync(request);
    

    FacebookResponses 类

    public class FacebookResponses implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @SerializedName("data")
    public FacebookRisp[] data;
    
    public FacebookRisp[] getData() {
        return data;
    }
    
    public void setData(FacebookRisp[] data) {
        this.data = data;
    }
    
    @Override
    public String toString() {
        return "FacebookResponses [data=" + Arrays.toString(data) + "]";
    }
    }
    

    FacebookRisp 类

    public class FacebookRisp implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @SerializedName("pic_square")
    private String pic_square;
    
    @SerializedName("pic")
    private String pic;
    
    @SerializedName("pic_big")
    private String pic_big;
    
    @SerializedName("pic_small")
    private String pic_small;
    
    @SerializedName("uid")
    private String uid;
    
    public String getPic() {
        return pic;
    }
    
    public void setPic(String pic) {
        this.pic = pic;
    }
    
    public String getPic_big() {
        return pic_big;
    }
    
    public void setPic_big(String pic_big) {
        this.pic_big = pic_big;
    }
    
    public String getPic_small() {
        return pic_small;
    }
    
    public void setPic_small(String pic_small) {
        this.pic_small = pic_small;
    }
    
    @SerializedName("name")
    private String name;
    
    public String getPic_square() {
        return pic_square;
    }
    
    public void setPic_square(String pic_square) {
        this.pic_square = pic_square;
    }
    
    public String getUid() {
        return uid;
    }
    
    public void setUid(String uid) {
        this.uid = uid;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "FacebookRisp [pic_square=" + pic_square + ", pic=" + pic + ", pic_big=" + pic_big + ", pic_small=" + pic_small + ", uid=" + uid
                + ", name=" + name + "]";
    }
    }
    

    【讨论】:

    • 为什么在不需要的时候使用@SerializedName?
    • @DiscDev 指定序列化名称是最佳实践;它将您的字段名称与您的网络模型分离。考虑一个开发人员,想知道为什么 pic_big 不使用驼峰法。他在 IDE 中将其重构为 picBig。哎呀,现在它一直是空的。至于为什么大部分时间都是这种情况,这不会立即显而易见。
    • @Tom 说得好。开发人员没有遵循正确的变量命名约定/最佳实践,这太糟糕了。我完全可以看到自己造成了您引用的错误。如果我遇到带有这样命名的成员变量的代码(在 Java 中),我会立即对其进行重构。谢谢!
    【解决方案2】:

    设置与 json 文件名匹配的基本类字段,添加注释 @serialaziedName("name_of_field") 并且 gson 应该在您注册类后完成剩下的工作

    【讨论】:

    • 你能帮我填写 FacebookResponse 课程吗?我对复杂的 JSON 有一些问题......
    • String pic_square, int uid, String name, 添加同名注释(虽然我很确定如果字段名称与 json 中的相同,则不需要)
    • 我得到这个错误:com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 26
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2019-07-03
    • 2014-07-01
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多