0

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

“消息”:“一条消息”

或者

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

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

String message;

并自定义消息对象

Message message; 

class Message{
String part_one;
String part_two;
}

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

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

4

2 回答 2

2

对于这个简单的示例,GSON 相当深入,但是如果您希望采用这种方法 ,可以使用广泛的GSON 用户指南。

简单的答案是使用android SDK 内置的JSONObject 类。有一个完整的 JSON 教程应该会有所帮助。

简单地:

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。

于 2012-06-20T12:16:22.663 回答
0

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

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);
    }
}
于 2015-04-10T11:48:50.660 回答