2017-02-15 16 views
1

JSONオブジェクト(APIに由来)をそれぞれのJavaオブジェクトにデシリアライズしようとしています。私はgsonライブラリ(Android用)を使用しています。問題は、私が数日間試してきたことであり、いくつかのオプションをテストした結果、運が良かったので、これについて少し助けていただければ幸いです。Gsonで複雑なJSON(複数のネストされた要素)を逆シリアル化する

* JSONが取得されました。 JSONsの全ての構造が類似して、私はそれを利用し、JSONからマップするためのオブジェクトを拡張したい受信ので

{ 
"status_code": 200, 
"status_message": "Here the status message", 
"result": { 
    "success": true, 
    "internalStatusCall": 1, 
    "response": 
      /* Can be a JSON object or a JSON array of objects */ 
    } 
} 

:私はAPIから受け取ったすべてのJSONsは、次のような構造に従ってください。

私のようなものに思うだろう:

このオブジェクトからの拡張
public class TABaseObject { 

@SerializedName("status_code") 
protected int status_code; 

@SerializedName("status_message") 
protected String status_message; 

protected String type; 

public TABaseObject(int status_code, String status_message, String type) { 
    this.status_code = status_code; 
    this.status_message = status_message; 
    this.type = type; 
} 
} 

、内部オブジェクトは、次のようになります。

public class TAResultObject extends TABaseObject{ 

@SerializedName("exito") 
protected boolean exito; 

@SerializedName("codigoEstado") 
protected int codigoEstado; 

public TAResultObject(int status_code, String status_message, boolean exito, int codigoEstado) { 
    super(status_code, status_message, "resultado"); 
    this.exito = exito; 
    this.codigoEstado = codigoEstado; 
} 

@Override 
public String toString() { 
    return super.toString() + " ////// " + "TAResultObject{" + 
      "exito=" + exito + 
      ", codigoEstado=" + codigoEstado + 
      '}'; 
} 

と、この他のオブジェクトから、私は特派オブジェクトにTAResultObjectを延長します。

私はいくつかのデシリアライズ手法(TypeAdapterFactory、RuntimeTypeAdapterFactoryなど)を運がないものとして試しました。

上記のJSONを逆シリアル化できる方法はありますか。私は本当にこの1つの助けを感謝します。

+0

それが提供JSONと頭の中でマッピングをマップすることは難しいです。あなたはおそらく追加する何かを逃しましたか? –

+0

@breo私の答えをチェックしましたか? – Krish

答えて

1

これは、Gson .ThenのカスタムTypeAdapterと一緒に、このクラスは、それがリストとオブジェクト応答の両方のために動作します

import java.util.List; 
import java.util.Map; 

import com.google.gson.annotations.SerializedName; 

    public class TAObject { 

     @SerializedName("status_code") 
     Integer status_code ; 

     @SerializedName("status_message") 
     String status_message ; 

     @SerializedName("result") 
     Result result ; 

     public class Result { 

      @SerializedName("success") 
      Boolean success ; 

      @SerializedName("internalStatusCall") 
      Integer internalStatusCall ; 

      @SerializedName("response") 
      List<Map> response ; 

     } 
    } 

使用レスポンスクラスと私のソリューションです。

ArrayAdapterクラス

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.TypeAdapter; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken; 
import com.google.gson.stream.JsonWriter; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 


class ArrayAdapter<T> extends TypeAdapter<List<T>> { 

    private Class<T> adapterclass; 

    public ArrayAdapter(Class<T> adapterclass) { 
     this.adapterclass = adapterclass; 
    } 

    @Override 
    public List<T> read(JsonReader reader) throws IOException { 

     List<T> list = new ArrayList<T>(); 
     Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create(); 

     final JsonToken token = reader.peek(); 
     System.out.println(token); 
     // Handling of Scenario 2(Check JavaDoc for the class) : 
     if (token == JsonToken.STRING || token == JsonToken.NUMBER || 
       token == JsonToken.BOOLEAN) { 
      T inning = (T) gson.fromJson(reader, adapterclass); 
      list.add(inning); 
     } else if (token == JsonToken.BEGIN_OBJECT) { 
      // Handling of Scenario 1(Check JavaDoc for the class) : 
      T inning = (T) gson.fromJson(reader, adapterclass); 
      list.add(inning); 
     } else if (token == JsonToken.BEGIN_ARRAY) { 
      reader.beginArray(); 
      while (reader.hasNext()) { 
       @SuppressWarnings("unchecked") 
       T inning = (T) gson.fromJson(reader, adapterclass); 
       list.add(inning); 
      } 
      reader.endArray(); 
     } 

     return list; 
    } 

    @Override 
    public void write(JsonWriter writer, List<T> value) throws IOException { 

    } 


} 

ArrayAdapterFactoryクラス

import com.google.gson.Gson; 
import com.google.gson.TypeAdapter; 
import com.google.gson.TypeAdapterFactory; 
import com.google.gson.reflect.TypeToken; 

import java.lang.reflect.ParameterizedType; 
import java.util.ArrayList; 
import java.util.List; 

public class ArrayAdapterFactory implements TypeAdapterFactory { 

    @Override 
    @SuppressWarnings({ "unchecked", "rawtypes" }) 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) 
    { 

     TypeAdapter<T> typeAdapter = null; 
     try { 
      if (type.getRawType() == List.class || type.getRawType() == ArrayList.class) { 

       typeAdapter = new ArrayAdapter(
         (Class) ((ParameterizedType) type.getType()) 
           .getActualTypeArguments()[0]); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return typeAdapter; 

    } 

} 

そして、このようなアダプタファクトリを登録し、

Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create(); 
+0

返信に遅れて申し訳ありません!答えてくれてありがとう!私はそこからフォローアップできる。 – breo

関連する問題