【问题标题】:Parse json object usng gson with changeable field使用可变字段解析 json 对象
【发布时间】:2012-06-20 11:59:11
【问题描述】:

我有json请求,可以包含下一个参数,最初我不知道参数的类型,可以是:

“消息”:“一条消息”

"message":{"part_one":"消息的第一部分","part_two":"第二部分 消息”}

我尝试将此字段解析为字符串

String message;

自定义消息对象

Message message; 

class Message{
String part_one;
String part_two;
}

我也尝试使用 List、Map 等,但是当类型不匹配时出现解析错误。

如何为fromJson() 函数(gson 库)构建解析输出对象? 请帮忙。

【问题讨论】:

    标签: android json string gson


    【解决方案1】:

    GSON 对于这个简单的示例相当深入,但是如果您希望采用这种方法,还有一个广泛的GSON user-guide

    不过,简单的答案是使用 android SDK 内置的JSONObject class。有一个 full JSON tutorial 应该会有所帮助。

    简单地说:

    JSONObject myObject = new JSONObject(myResponseString);
    

    有几个函数可以从对象中提取数据,您可以在函数或响应对象构造函数中使用这些函数来简化代码库。

    如果你有一个对象数组,那么使用JSONArray

    最重要的是,阅读http://developer.android.com上的文档

    UDPATE

    您可以使用 optJSONObject 方法来检测“消息”值是否是一个对象而不是一个简单的字符串。

    要使用您的示例类,请向您的消息类添加一个方法:

    public static Message fromJson(string jsonString) throws JSONException
    {
    
        JSONOBject jsonObject = new JSONObject(jsonString);
    
        Message message = new Message(); //create our return object
    
        JsonObject messageObject = jsonObject.optJSONObject("message");
    
        if(messageObject!=null)
        {
            //get our member variables from the messageObject
            message.part_one = messageObject.getString("part_one");
            message.part_two = messageObject.getString("part_two");
        }
        else
        {   // it's a simple string so just get the string from jsonObject
            message.part_one = jsonObject.getString("message");
        }
        return message;
    }
    

    当然,您应该添加异常处理,如果解析失败,可能会抛出自定义异常或返回 null。

    【讨论】:

    • 问题是不知道什么类型的“消息”会是
    • 这是一个重要的问题,您需要添加更多详细信息和到目前为止的代码...Stack Overflow 不是为您生成代码的服务,但我们会帮助解决问题,你必须付出一些努力
    • 我不需要很多代码,我只想知道如何将两种类型设置为一个变量,或者其他的。
    • 使用 optJSONObject 检测消息是什么,即字符串或另一个 JSONObject
    【解决方案2】:

    我的最后一个解决方案 - 自定义

    JsonDeserializer

    Json 消息:

    1) 成功消息

    {"data": ["success"],
           "message": "message_text"
        }
    

    2) 错误信息

    {"message": { "name": ["message_text"], "email": ["message_text"], "subject": ["message_text"], "body": ["message_text"] }}

    也许它可以帮助某人。

     public static class GeneralResponceDeserializer implements JsonDeserializer {
    
        @Override
        public Object deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
            JsonObject jobject = (JsonObject) jsonElement;
            Gson googleJson = new Gson();
            ArrayList<String> dataList = null;
            if (jobject != null && jobject.get("data") != null) {
                JsonArray dataArray = jobject.get("data").getAsJsonArray();
                dataList =  googleJson.fromJson(dataArray, new TypeToken<List<String>>(){}.getType());
            }
            String message = null;
            Message messageObject = null;
            if (jobject != null && jobject.get("message") != null) {
                try {
                    message = jobject.get("message").getAsString();
                } catch (UnsupportedOperationException e) {
                    JsonElement messageObjectJson = (JsonObject) jobject.get("message").getAsJsonObject();
                    JsonObject jMessageobject = (JsonObject) messageObjectJson;
                    if (jMessageobject != null) {
                        JsonArray name = jMessageobject.getAsJsonArray("name");
                        JsonArray subject = jMessageobject.getAsJsonArray("subject");
                        JsonArray body = jMessageobject.getAsJsonArray("body");
                        JsonArray email = jMessageobject.getAsJsonArray("email");
                        ArrayList<String> nameDataList = null;
                        ArrayList<String> subjectDataList = null;
                        ArrayList<String> bodyDataList = null;
                        ArrayList<String> emailDataList = null;
                        if (name != null) {
                            nameDataList =  googleJson.fromJson(name, new TypeToken<List<String>>(){}.getType());
                        }
                        if (subject != null) {
                            subjectDataList =  googleJson.fromJson(subject, new TypeToken<List<String>>(){}.getType());
                        }
                        if (body != null) {
                            bodyDataList =  googleJson.fromJson(body, new TypeToken<List<String>>(){}.getType());
                        }
                        if (email != null) {
                            emailDataList = googleJson.fromJson(email, new TypeToken<List<String>>(){}.getType());
                        }
                        messageObject = new Message(nameDataList, subjectDataList, bodyDataList, emailDataList);
                    }
                }
            }
    
    
            return new GeneralResponceObject(dataList, message, messageObject);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-13
      • 1970-01-01
      • 2015-12-04
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多