【问题标题】:Gson parser class for dynamic json key value - Android用于动态 json 键值的 Gson 解析器类 - Android
【发布时间】:2014-02-05 06:42:12
【问题描述】:

我使用 gson 库来解析 json 响应。它运作良好。现在我遇到了问题。

我收到以下来自网络服务的响应。 json键值不是静态的,会动态变化的。

如何编写解析器类来解析以下响应。

格式化的 JSON

{
    "meta": {
        "code": 201,
        "dataPropertyName": "activity",
        "currentTime": "2014-02-05 06:15:04",
        "listedCount": "2"
    },
    "activity": [
        {
            "comments": [
                {
                    "raja": {
                        "type": "Liked",
                        "userPhoto": "663.png",
                        "userId": "74",
                        "userName": {
                            "1_0": "longjump"
                        },
                        "postOwner": "you",
                        "postDetails": {
                            "471": {
                                "postImage": "972.png",
                                "postId": "471",
                                "postType": "1"
                            }
                        },
                        "dateTime": "2014-02-05 05:24:56",
                        "sameOwner": "1"
                    }
                }
            ]
        },
        {
            "follow": [
                {
                    "you": {
                        "type": "follow",
                        "followByUserName": {
                            "0_0": "olivepop",
                            "1_0": "yadidroy",
                            "2_0": "chitra"
                        },
                        "followUserName": "you",
                        "followByUserPhoto": "242.png",
                        "followUserPhoto": "953.png",
                        "dateTime": "2014-01-09 06:50:42"
                    }
                }
            ]
        }
    ],
    "notifications": [
        "Activities has been retrieved successfully"
    ]
}

【问题讨论】:

  • 你有一个特定的动态键
  • 哪些字段不是静态的...?您提供的示例 json str 中的所有内容都相同。
  • 在那个响应中 raja,471,you,1_0,2_0,3_0, 是动态键值

标签: android gson


【解决方案1】:

使用这个解析器类

Meta meta = new Meta();

    ArrayList<Activity> activity = new ArrayList<ActivityParser.Activity>();

    ArrayList<String> notifications = new ArrayList<String>();

    public class Meta
    {
        String code,dataPropertyName,currentTime,listedCount;
    }

    public class Activity
    {
        ArrayList<HashMap<String, CommentsItem>> comments = new ArrayList<HashMap<String,CommentsItem>>();

        public class CommentsItem
        {
            String type,userPhoto,userId,postOwner,dateTime,sameOwner;
            HashMap<String, String> userName = new HashMap<String,String>();
            HashMap<String, PostDetails> postDetails = new HashMap<String,PostDetails>();
            public class PostDetails
            {
                String postImage,postId,postType;
            }

        }

        ArrayList<HashMap<String, FollowItem>> follow = new ArrayList<HashMap<String,FollowItem>>();

        public class FollowItem
        {
            String type,followUserName,followByUserPhoto,followUserPhoto,dateTime;
            HashMap<String, String> followByUserName = new HashMap<String,String>();
        }
    }

【讨论】:

    【解决方案2】:

    如果可能,获取包含所有可能“键”值的 JSON 响应,然后从以下链接获取 POJO 类自动构建:

    POJO FOR GSON

    它将自动处理所有可能性。但是请确保您在生成 POJO 时提供的 RESPONCE 应该包含您的密钥的所有可能组合[更改一次]。

    希望这有帮助!

    【讨论】:

    • 这对于动态键没有帮助。因为它会尝试为每个具有不同动态键的对象考虑单独的类,尽管内容将保持不变
    【解决方案3】:

    根据您的规范,您可以创建一个默认 Web 服务响应 model.java,类似于:

    String success;
    @SerializedName("error_msg")
    String errorMessage;
    @SerializedName("error_code")
    String errorCode;
    JsonObject data;  
    

    具有动态键的对象的父对象将是“数据”。
    使用 Gson,映射模型类:

    webserviceResponse= gson.fromJson(contentResponse,WebserviceResponse.class);
    if (StringUtils.isNotEmpty(webserviceResponse.getSuccess()) && 
    StringUtils.equalsIgnoreCase(webserviceResponse.getSuccess(), "success")) {
    //check for the dynamic key name
                    JsonObject job = webserviceResponse.getData();
                    dynamicallyDefinedKeyClass= gson.fromJson(job.get("dynamicKeyValue"), DynamicallyDefinedKeyClass.class);
                }  
    

    如果有帮助,我会以任何方式编辑我的问题编辑答案
    只是一个建议- raja,您等可以是键名或 cmetsBy 的值吗?你从哪里得到这个回复?

    【讨论】:

    • 我怎么知道“dynamicKeyValue”。它将改变每一个网络服务。那我怎么能给出动态键值
    • inside "raja" ..对象和键不是动态的 -"type","userPhoto","userId" ..所以你需要模型类来处理 "raja" 的内容, “你”——你会从 Json 对象中得到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多