2016-10-04 90 views
0

我有一個errorLogList json數據,它可以是對象或數組。我想讓Gson處理數組和對象。我發現了一些類型適配器,但我不知道如何在內部字符串列表中使用它。有沒有解決方法?如何處理json對象或數組?

Gson gson = new Gson(); 
LogData logData= gson.fromJson(jsonData, LogData.class); 

JSON數據示例;

"{"time":1473092580000,"logs":{"errorLog":{"errorLogList":"fatal error occured","id":"2323232"}}}" 

"{"time":1473092580000,"logs":{"errorLog":{"errorLogList":["fatal error occured","warning occured"],"id":"2323232"}}}" 

public class LogData{ 
    private Log logs; 
    .... 
} 

public class Log{ 
    private ErrorLog errorLog; 
    .... 
} 

public class ErrorLog{ 
    private List<String> errorLogList; 
} 

回答

2

你可以試試這個:

GsonBuilder gsonBuilder = new GsonBuilder(); 

gsonBuilder.registerTypeAdapter(ErrorLog.class, new JsonDeserializer<ErrorLog>() { 
    @Override 
    public ErrorLog deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 

    ErrorLog errorLog = new ErrorLog(); 
    List<String> errorLogList = new ArrayList<>(); 

    JsonElement errorLogJson = json.getAsJsonObject().get("errorLogList"); 

    if (errorLogJson.isJsonArray()) { 
     JsonArray jsonArray = errorLogJson.getAsJsonArray(); 
     for (int i = 0; i < jsonArray.size(); i++) { 
     errorLogList.add(jsonArray.get(i).getAsString()); 
     } 
    } else{ 
     errorLogList.add(errorLogJson.getAsString()); 
    } 

    errorLog.setErrorLogList(errorLogList); 

    return errorLog; 
    } 
}); 

LogData logData = gsonBuilder.create().fromJson(jsonData, LogData.class); 
+0

您的解決方案可以完美運行。有沒有任何通用的反序列化方法?因爲我還有其他一些列表。 – hellzone

+0

對於其他列表,您需要爲此提供單獨的邏輯。 –

0

GSON提供了創建自定義的串行(JsonSerializer<?>)及解串器(JsonDeserializer<?>)的可能性。他們可以註冊這樣的:

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(LogData.class, new LogDataDeserializer()); 
    Gson gson = gsonBuilder.create(); 

你可以反序列化JSON是這樣的:

Type listOfIssuesType = new TypeToken<ArrayList<LogData>>() { 
    }.getType(); 
    List<LogData> logData= getIssueGson().fromJson(json, listOfIssuesType); 

對於反序列化數組我用下面的功能:

public List<String> getArrayNullSave(JsonObject object, String fieldName) { 
    if(object.get(fieldName) == null || object.get(fieldName).isJsonNull()) 
     return null; 
    List<String> list = new ArrayList<String>(); 
    for (JsonElement jsonElement : object.get(fieldName).getAsJsonArray()) { 
     list.add(jsonElement.getAsString()); 
    } 
    return list; 
} 

希望它能幫助。