【问题标题】:GSON DeserializationGSON 反序列化
【发布时间】:2014-11-30 07:53:12
【问题描述】:

我正在尝试使用 GSON 反序列化 JSON……下面是我迄今为止所做的工作……到目前为止,我能够反序列化第一层,但没有其他内容。

异步任务:

            //Deserialization
            Type deserializationType = new TypeToken<ReceiveMessageResponceModel<IncMessages>>() {}.getType();
            ReceiveMessageResponceModel<IncMessages> responceModel = gson.fromJson(sb.toString(), deserializationType);
            IncMessages messages = (IncMessages) responceModel.getValue();

            success = responceModel.getSuccess();

            Log.i(Utils.TAG, "getMessage: "+ responceModel.getMessage());

            if (success) {
                Log.i(Utils.TAG, "Name: "+ messages.getName());

                List<Messages> lstMessages = messages.getMessages();

                if (lstMessages != null) {
                    Log.i(Utils.TAG, "" + lstMessages.size());
                } else {
                    Log.i(Utils.TAG, "lstMessages is null");
                }
            }

ReceiveMessageResponceModel:

public class ReceiveMessageResponceModel <T>  {
    private Boolean success;
    private String message;
    private T data;

    public T getValue() {
        return data;
    }

    public void setValue(T data) {
        this.data = data;
    }

    public Boolean getSuccess() {
        return success;
    }

    public String getMessage() {
        return message;
    }
}

IncMessages:

public class IncMessages {

    String names;
    List<Messages> messages;

    public String getName() {
        return names;
    }

    public List<Messages> getMessages() {
        return messages;
    }
}

消息:

public class Messages {
    String message_id;
    String user_id;
    String from_id;
    String group_id;
    String message_content;
    String message_extra;
    String message_type;
    String flag_status;
    String lock_status;
    String read_status;
    String del_status;
    String is_downloaded;
    String scheduled;
    String date_added;
    String date_scheduled;
    String to_avatar;
    String to_user;
    String from_avatar;
    String from_user;
    String from_me;
    ....

JSON:

{"success":true,"message":"messages successfully retrieved",
        "data":{
            "7148bc5e5065d61bd3a4b00318824db0":{
                "names":"Jason%20Caruso6",
                    "messages":[
                        {"message_id":"1953",
                            "user_id":"22fdaf2ad15eb23f62c14f1f9ef55f89",
                            "from_id":"22fdaf2ad15eb23f62c14f1f9ef55f89",
                            "group_id":"7148bc5e5065d61bd3a4b00318824db0",
                            "message_content":"blah!",
                            "message_extra":"",
                            "message_type":"plain",
                            "flag_status":"0",
                            "lock_status":"0",
                            "read_status":"0",
                            "del_status":"0",
                            "is_downloaded":"0",
                            "scheduled":"0",
                            "date_added":"2014-11-29 23:15:09",
                            "date_scheduled":"0000-00-00 00:00:00",
                            "to_avatar":"http:\/\/messageproapp.com\/_app\/_profiles\/e39933b7acd117ada0f3117c6a78a69c.jpg",
                            "to_user":"Jason%20Caruso6",
                            "from_avatar":"http:\/\/messageproapp.com\/_app\/_profiles\/e39933b7acd117ada0f3117c6a78a69c.jpg",
                            "from_user":"Jason%20Caruso6",
                            "from_me":true}]}}}

日志:

11-30 01:44:49.241: I/PROJECTCARUSO(7488): getMessage: messages successfully retrieved
11-30 01:44:49.241: I/PROJECTCARUSO(7488): Name: null
11-30 01:44:49.241: I/PROJECTCARUSO(7488): lstMessages is null

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    似乎还有另一个层次。您没有考虑到键 "7148bc5e5065d61bd3a4b00318824db0" 映射了您的 IncMessages 对象。

    所以像这样的工作:

    class ReceiveMessageResponceModel <T>  {
        private Boolean success;
        private String message;
        private Data<T> data;
    
        public T getValue() {
            return data.t;
        }
    
        public void setValue(Data<T> data) {
            this.data = data;
        }
    
        public Boolean getSuccess() {
            return success;
        }
    
        public String getMessage() {
            return message;
        }
    }
    
    
    class Data<T> {    
       @SerializedName("7148bc5e5065d61bd3a4b00318824db0")
       T t;
    }
    
    class IncMessages {
    
        String names;
        List<Messages> messages;
    
        public String getName() {
            return names;
        }
    
        public List<Messages> getMessages() {
            return messages;
        }
    }
    

    我还认为密钥“7148bc5e5065d61bd3a4b00318824db0”不是恒定的。如果您想跳过密钥(或至少忽略其实际值),当然可以使用自定义反序列化器来完成。另见Dealing with randomly generated and inconsistent JSON field/key names using GSON

    【讨论】:

    • 我尝试了这个答案,但它不处理 JSONArrays
    • @ZouZou 我也有类似的问题here 与 GSON 相关。看看你能不能帮帮我?
    【解决方案2】:

    我认为您的 json 对象格式不正确。如果我看到你的 json 字符串, 状态是键,真是值, 消息是键及其对应的值, 数据是关键,IncMessage 是价值。

    但是在你的json中,7148bc5e5065d61bd3a4b00318824db0是什么数据的值?

    试试这个 json

    {
        "success": true,
        "message": "messages successfully retrieved",
        "data": {
            "names": "Jason%20Caruso6",
            "messages": [
                {
                    "message_id": "1953",
                    "user_id": "22fdaf2ad15eb23f62c14f1f9ef55f89",
                    "from_id": "22fdaf2ad15eb23f62c14f1f9ef55f89",
                    "group_id": "7148bc5e5065d61bd3a4b00318824db0",
                    "message_content": "blah!",
                    "message_extra": "",
                    "message_type": "plain",
                    "flag_status": "0",
                    "lock_status": "0",
                    "read_status": "0",
                    "del_status": "0",
                    "is_downloaded": "0",
                    "scheduled": "0",
                    "date_added": "2014-11-29 23:15:09",
                    "date_scheduled": "0000-00-00 00:00:00",
                    "to_avatar": "http://messageproapp.com/_app/_profiles/e39933b7acd117ada0f3117c6a78a69c.jpg",
                    "to_user": "Jason%20Caruso6",
                    "from_avatar": "http://messageproapp.com/_app/_profiles/e39933b7acd117ada0f3117c6a78a69c.jpg",
                    "from_user": "Jason%20Caruso6",
                    "from_me": true
                }
            ]
        }
    }
    

    【讨论】:

    • JSON 是正确的,这不是问题,但感谢您的输入。值 7148bc5e5065d61bd3a4b00318824db0Jason%20Caruso6 用户 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多