2017-08-27 13 views
0

エンドポイントは以下のようなJSON応答を返します。Android:どのように値の配列をマップする?

{ 
    "students":[ 
     [ 
     1, 
     "Tom", 
     18, 
     "USA" 
     ], 
     [ 
     2, 
     "Linda", 
     21, 
     "Mexico" 
     ] 
    ], 
    "other":[ 
     "100", 
     "400" 
    ] 
} 

のは私だけ反応してstudentsを気にし、学生のリストを取得したいとしましょう。応答では、各学生は、キーなしの値の配列として表される。

[id, name, age, country] 

(複数のフィールドが存在することができると仮定するが、フィールドの順序は、すべての学生のために同じである)

class GetStudentsResponse { 
    Student[] students; 
} 

class Student { 
    String name; 
    int age; 
    // HOW CAN I TELL RETROFIT TO MAP CORRECTLY HERE? 
} 

答えて

0

RetrofitはJSON(de)シリアライゼーション自体を行っていません - 別のライブラリを使用します。これはデフォルトではGSONです。

あなたは実際には配列([id, name, age, country])を持っていますので、GSONがデフォルトで生成するシリアライザ(JSONオブジェクトが必要です)を使用してオブジェクトに解析することはできません。あなたはString[]にその配列を解析し、Studentにそれを解析したり、その入力ための独自のGSON・シリアライザを書くことができますいずれかのような場合には

Gson gson = new GsonBuilder().registerTypeAdapter(Student.class, serializer).create();

別のアプローチTypeAdapterを作成することです。これは次のようにあなたがそれを使用することになり

JsonSerializer<Student> serializer = new JsonSerializer<Merchant>() { 
    @Override 
    public JsonElement serialize(Student src, Type typeOfSrc, JsonSerializationContext context) { 
     // Implement serializer here 
    } 
}; 


JsonDeserializer<Student> serializer = new JsonDeserializer<Student>() { 
    @Override 
    public JsonElement deserialize(Student src, Type typeOfSrc, JsonSerializationContext context) { 
     // Implement deserializer here 
    } 
}; 

:私は、第二の溶液をお勧めします。ここでGson documentationからの例です:

public class PointAdapter extends TypeAdapter<Point> { 
    public Point read(JsonReader reader) throws IOException { 
    if (reader.peek() == JsonToken.NULL) { 
     reader.nextNull(); 
     return null; 
    } 
    String xy = reader.nextString(); 
    String[] parts = xy.split(","); 
    int x = Integer.parseInt(parts[0]); 
    int y = Integer.parseInt(parts[1]); 
    return new Point(x, y); 
    } 
    public void write(JsonWriter writer, Point value) throws IOException { 
    if (value == null) { 
     writer.nullValue(); 
     return; 
    } 
    String xy = value.getX() + "," + value.getY(); 
    writer.value(xy); 
    } 
} 
+0

? Retrofitオブジェクトをビルドするとどうなりますか?また、私は他の人がTypeAdapterFactoryと呼ばれるものを使用しているのを見ています。それはあなたが話しているのと同じことですか? –

+0

'TypeAdapterFactory'は、ネストされたオブジェクトを持ち、既存の型アダプタを再利用する場合に便利です。あなたの場合、オブジェクトは( '{}'で囲まれ、 '' age''のようなフィールド名を持っていません)、あなたのケースでは推奨されませんが、それは私の答えです。 – syntagma

0

レトロフィットは2 エンドポイントのレスポンスボディは、配列などで始まるとき:

ユーザー:

[ 
{"name": "John", 
    "email": "[email protected]" 
}, 
{"name": "Jess", 
    "email": "[email protected]" 
}, 
... 
] 

では、次のアプローチを使用することができます.java

public class User { 
    public String name; 
    public String email; 
} 

インターフェイス: InterfaceAPI.java

​​

データプロバイダクラス:私はこれらのコードを入れてください

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("https://api.example.com") 
     .client(okHttpClient) 
     .build(); 

    InterfaceAPI retrofitAPI = retrofit.create(InterfaceAPI); 
    Call<List<User>> call = interfaceAPI.getUsers(); 

    call.enqueue(new Callback<RegistrationResponse>() { 
     @Override 
     public void onResponse(@NonNull Call<List<User>>call, @NonNull Response<List<User>> response) { 
      if (response.isSuccessful()) { 
       // your code 

      } else { 
       // your code 
      } 
     } 

     @Override 
     public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) { 
      //TODO 
     } 
    }); 

See here more examples.

関連する問題