2012-06-20 2 views
0

У меня есть запрос JSon, который может состоять следующий параметр, сначала я не знал, типа параметра, это может быть:Анализировать объект JSON usng gson с изменяемым полем

«сообщение»: "одно сообщение "

или

"сообщение": {" part_one ":" первая часть сообщения», "part_two": "вторая часть сообщени"}

Я пытаюсь разобрать это поле для строки

String message; 

и пользовательского объект Message

Message message; 

class Message{ 
String part_one; 
String part_two; 
} 

Также я стараюсь использовать List, Map и другой, но я разбор ошибки, когда тип не совпадает.

Как я могу построить синтаксический анализ выходного объекта для функции fromJson() (gson library)? Пожалуйста, помогите.

ответ

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, если вы хотите продолжить этот метод.

Простой ответ, однако, заключается в использовании его JSONObject class, который встроен в SDK android. Существует 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; 
} 

Вы должны, конечно, добавить обработку исключений и, возможно, бросить специальное исключение или вернуть нулевое значение, если синтаксический анализ терпит неудачу.

+0

проблема в том, что неизвестно, какой тип «сообщение» будет – Natali

+0

это нетривиальный вопрос, вам нужно добавить больше деталей и код, который вы имеете до сих пор ... [SO] является не сервис для создания кода для вас, но мы будем помогать решать проблемы, вы должны приложить некоторые усилия, хотя – Merlin

+0

Мне не нужно много кода, я только хочу знать, как я могу установить два типа для одной переменной, , – Natali

Смежные вопросы