【问题标题】:Multiple JSON objects inside a JSON object instead of in an arrayJSON 对象内部而不是数组中的多个 JSON 对象
【发布时间】:2018-03-06 11:50:58
【问题描述】:

我正在使用一个提供以下响应的 API。 (为简单起见,我将 Data 中的对象数量减少到 2 个)。

{
"Response": "Success",
"Message": "Coin list succesfully returned!",
"BaseImageUrl": "https://www.cryptocompare.com",
"BaseLinkUrl": "https://www.cryptocompare.com",
"Data": {
          "42": {
          "Id": "4321",
          "Url": "/coins/42/overview",
          "ImageUrl": "/media/19984/42.png",
          "Name": "42",
          "CoinName": "42 Coin",
          "FullName": "42 Coin (42)",
          "Algorithm": "Scrypt",
          "ProofType": "PoW",
          "FullyPremined": "0",
          "TotalCoinSupply": "42",
          "PreMinedValue": "N/A",
          "TotalCoinsFreeFloat": "N/A",
          "SortOrder": "34"
          },
          "365": {
          "Id": "33639",
          "Url": "/coins/365/overview",
          "ImageUrl": "/media/352070/365.png",
          "Name": "365",
          "CoinName": "365Coin",
          "FullName": "365Coin (365)",
          "Algorithm": "X11",
          "ProofType": "PoW/PoS",
          "FullyPremined": "0",
          "TotalCoinSupply": "2300000000",
          "PreMinedValue": "N/A",
          "TotalCoinsFreeFloat": "N/A",
          "SortOrder": "916"
          }
},
"Type": 100
}

我想将 Data 中的所有对象放在一个数组中,以便我可以将它们传递给我的 RecyclerView 的适配器。

我使用 Retrofit2 和 RxJava2 进行网络操作。

这是我现在改造建造者的代码:

 Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();

我还生成了 POJO 类 Coin 和 Data 使用:http://www.jsonschema2pojo.org/

我已经编辑了 Data 类,使其包含一个 Coin 数组而不是单个对象:

public class Data {
@SerializedName("Coin")
    @Expose
    private Coin[] coins;

    public Coin[] getCoin() {
        return coins;
    }

    public void setCoins(Coin[] coins){}
}

如何将 Data 中的所有对象添加到 Coin 数组中? 我是否需要创建自定义转换器,如果需要,我该如何实现?

提前致谢!

【问题讨论】:

    标签: android arrays json object


    【解决方案1】:

    这是你的数据类:

    import com.google.gson.Gson;
    import com.google.gson.TypeAdapter;
    import com.google.gson.annotations.JsonAdapter;
    import com.google.gson.stream.JsonReader;
    import com.google.gson.stream.JsonWriter;
    
    import java.io.IOException;
    import java.util.ArrayList;
    
    
    @JsonAdapter(Data.DataJsonAdapter.class)
    public class Data {
        private Coin[] coins;
    
        public Coin[] getCoin() {
            return coins;
        }
    
        public void setCoins(Coin[] coins) {
             this.coins = coins;
        }
    
        public static class DataJsonAdapter extends TypeAdapter<Data> {
            @Override
            public void write(JsonWriter out, Data value) throws IOException {
                // TODO: Maybe implement
            }
    
            @Override
            public Data read(JsonReader reader) throws IOException {
                ArrayList<Coin> coins = new ArrayList<>();
                Gson gson = new Gson();
                reader.beginObject();
                while (reader.hasNext()) {
                    reader.nextName(); // Read "42", "365", ...
                    coins.add(gson.fromJson(reader, Coin.class));
                }
                reader.endObject();
    
                Data data = new Data();
                // Can probably be simplified
                Coin[] array = new Coin[coins.size()];
                coins.toArray(array); // fill the array
                data.setCoins(array);
    
                return data;
            }
        }
    }
    

    然后在你的代码中的某个地方,只需调用:

    Gson gson = new Gson();
    Data data = gson.fromJson(yourJson, Data.class);
    

    我没有,但您可能应该在阅读阅读器时检查是否存在预期类型的​​ next,以防止崩溃。

    【讨论】:

      【解决方案2】:
      public class All_Plan  {
      
          @SerializedName("Coin")
          private ArrayList<CoinData> data;
      
          @SerializedName("status")
          private String status;
      
          public ArrayList<CoinData> getData() {
              return data;
          }
      
          public void setData(ArrayList<CoinData> data) {
              this.data = data;
          }
      
          public String getStatus() {
              return status;
          }
      
          public void setStatus(String status) {
              this.status = status;
          }
      }
      

      【讨论】:

      • 这将如何解决将 Data 中的所有对象放入数组中的问题?
      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2020-03-01
      • 2017-03-27
      相关资源
      最近更新 更多