2016-10-04 6 views
0

object 또는 array 일 수있는 errorLogList json 데이터가 있습니다. 나는 Gson에게 배열과 객체를 모두 처리하길 원한다. 일부 TypeAdapter를 발견했지만 내부 String List와 함께 사용하는 방법을 모르겠습니다. 어떤 해결책이 있습니까?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

귀하의 솔루션은 완벽하게 작동합니다. deserialize하는 일반적인 방법이 있습니까? 나는 다른리스트도 가지고 있기 때문에. – hellzone

+0

다른 목록의 경우 별도의 논리를 제공해야합니다. –

0

는 GSON 사용자 정의 시리얼 (JsonSerializer<?>) 및 디시리얼라이저 (JsonDeserializer<?>)를 생성 할 수있는 가능성을 제공합니다. 그들은 다음과 같이 등록 할 수 있습니다 :

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

는이처럼 JSON을 역 직렬화 할 수 있습니다

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

는 희망이 도움이 :

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

나는 다음과 같은 기능을 사용하여 배열을 직렬화 복원하십시오.

관련 문제