2012-06-20 53 views
0

我有JSON请求它可以由下一个参数,最初我不知道的参数的类型,它可以是:解析JSON对象USNG GSON

“消息”:“一个消息“

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

我尝试这个领域解析字符串

String message; 

,并自定义消息对象

Message message; 

class Message{ 
String part_one; 
String part_two; 
} 

我也尝试使用列表,地图等,但我已经当了解析错误类型不匹配。

如何建立解析输出对象fromJson()功能(GSON库)? 请帮忙。

回答

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); 
    } 
} 
2

GSON是相当深入的这个简单的例子,但有一个广泛GSON user-guide如果您想追求这个方法。

答案很简单,虽然是用他那被内置到Android SDK JSONObject class。有一个full JSON tutorial这应有助于。

简单:

JSONObject myObject = new JSONObject(myResponseString); 

有几个功能,然后从您可以在您的函数或响应对象构造函数中使用,以简化你的代码的对象中提取数据。

如果你有对象的数组,然后使用JSONArray

最重要的是,在阅读文档

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。

+0

的问题是,它是未知的什么类型的“消息”的将是 – Natali

+0

这是一个不平凡的问题,你需要增加更多的细节和代码,你有这么远... [SO]是不是一个服务来产生你的代码你,但我们会帮助解决的问题,必须花心思虽然 – Merlin

+0

我并不需要大量的代码,我只是想知道我怎么可以设置两种类型,以一个变量,矿点别的。 – Natali