2012-06-20 194 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