2016-10-04 7 views
0

私はオブジェクトまたは配列である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

あなたのソリューションは完璧に動作します。デシリアライズするための一般的な方法はありますか?他にもいくつかのリストがあるからです。他のリストの場合は – hellzone

+0

、別のロジックを提供する必要があります。 –

0

Gsonは、カスタムシリアライザ(JsonSerializer<?>)とデシリアライザ(JsonDeserializer<?>)を作成する可能性を提供しています。私は次の関数を使用する配列をデシリアライズするために

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

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

はそれが役に立てば幸い彼らは次のように登録することができます。

関連する問題