2016-10-04 97 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; 
} 

希望它能帮助。