Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态json键值的Gson解析器类-Android_Android_Gson - Fatal编程技术网

动态json键值的Gson解析器类-Android

动态json键值的Gson解析器类-Android,android,gson,Android,Gson,我已经使用gson库解析json响应。它工作得很好。现在我遇到了一个问题 我收到了以下来自webservice的回复。json键值不是静态的,它将动态更改 如何编写解析器类来解析下面的响应 格式化JSON: { "meta": { "code": 201, "dataPropertyName": "activity", "currentTime": "2014-02-05 06:15:04", "listedCount":

我已经使用gson库解析json响应。它工作得很好。现在我遇到了一个问题

我收到了以下来自webservice的回复。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"
    ]
}

根据您的规范,您可以创建一个默认的Webservice response 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,you等。可以是键名或注释的值吗?您从何处获取此响应?

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

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

希望这有帮助

使用这个解析器类

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>();
        }
    }
Meta-Meta=new-Meta();
ArrayList活动=新建ArrayList();
ArrayList通知=新建ArrayList();
公共类元
{
字符串代码,dataPropertyName,currentTime,listedCount;
}
公共课堂活动
{
ArrayList comments=新的ArrayList();
公共类评论
{
字符串类型,userPhoto,userId,postOwner,dateTime,sameOwner;
HashMap用户名=新建HashMap();
HashMap postDetails=新建HashMap();
公开课邮递详情
{
字符串postImage、postId、postType;
}
}
ArrayList follow=新的ArrayList();
公共类FollowItem
{
字符串类型,followUserName,followByUserPhoto,followUserPhoto,dateTime;
HashMap followByUserName=新HashMap();
}
}

您是否有一个字段不是静态的动态键。。。?在您提供的示例json str中,所有这些都是相同的。在该响应中,raja,471,您,1_0,2_0,3_0,是动态键值我如何知道“dynamicKeyValue”。它将改变每一个Web服务。那么我如何在“raja”中给出dynamickeyValue。对象和键不是动态的——“type”、“userPhoto”、“userId”。因此,您需要为“raja”、“you”的内容提供模型类,您可以从Json对象中获得这些内容。对于动态键,这是没有帮助的。因为它将尝试为每个对象使用不同的动态键考虑单独的类,尽管内容将保持相同。