代码之家  ›  专栏  ›  技术社区  ›  Ivan Sablin

使用GsonConverterFactory进行改装

  •  0
  • Ivan Sablin  · 技术社区  · 7 年前

    我得到了这个gson格式:

    {
    "ltc_btc":{
        "high":105.41,
        "low":104.67,
        "avg":105.04,
        "vol":43398.22251455,
        "vol_cur":4546.26962359,
        "last":105.11,
        "buy":104.2,
        "sell":105.11,
        "updated":1418654531
    }
    ...
    

    我正试图通过GSONConverterFactory对其进行解析,但它只有在如下声明时才起作用:

    @SerializedName("ltc_btc")
    @Expose
    TickerPoint pair;
    

    但这并不能解决问题,因为“ltc\U bts”总是不同的。有什么想法吗?

    另外,我试过HashMap——同样的NPE。

    3 回复  |  直到 7 年前
        1
  •  0
  •   mbakgun    7 年前

    “ltc\U bts”键就是您的对象类名。您需要将json反序列化到对象。

    只需在参数中传递类,然后在需要时使用参数的类进行序列化。

        2
  •  0
  •   Arsen Sench    7 年前

    为“ltc\U btc”创建一个类(或者不管它是什么,可能是“eth\U btc”。如果值对象相同,则需要一个模板)。

    public class CryptoCurrencyExchangeModel {
    //one of this fields for you must be primary. that field must never be null
    
        @SerializedName("high")
        private Double high;
    
        @SerializedName("low")
        private Double low;
    
        @SerializedName("avg")
        private Double avg;
    
        @SerializedName("vol")
        private Double vol;
    
        @SerializedName("vol_cur")
        private Double vol_cur;
    
        @SerializedName("last")
        private Double last;
    
        @SerializedName("buy")
        private Double buy;
    
        @SerializedName("sell")
        private Double sell;
    
        @SerializedName("updated")
        private Long updated;
    
    
    }
    

    现在需要将json解析为JsonObject。在本例中,json是一个字符串,您将从改装响应中获得该字符串。

    JSONObject currencyJsonObject = new JSONObject("{
    "ltc_btc":{
        "high":105.41,
        "low":104.67,
        "avg":105.04,
        "vol":43398.22251455,
        "vol_cur":4546.26962359,
        "last":105.11,
        "buy":104.2,
        "sell":105.11,
        "updated":1418654531
    }");
    

    之后,您需要从JsonObject获取键,并对其进行迭代,以获得所需的对象。

        Iterator<?> keys = jObject.keys();
        CryptoCurrencyExchangeModel cryptoCurrencyExchangeModel;
        Gson gson;
        while( keys.hasNext() ) {
            String key = (String)keys.next();
            if ( jObject.get(key) instanceof JSONObject ) {
               cryptoCurrencyExchangeModel = gson.fromJson(jObject.get(key).toString(), CryptoCurrencyExchangeModel);
               if(cryptoCurrencyExchangeModel != null && cryptoCurrencyExchangeModel.buy != null){
          //here you do what you want
    }
            }
        }
    
        3
  •  0
  •   Ivan Sablin    7 年前

    解决方案如下:

    public Observable<TickerResponse> getTicker(YobitPublic api, String first_coin, String second_coin) {
        Call<JsonObject> call = api.getTickerObservable(first_coin + "_" + second_coin);
        return Observable.create( emitter -> {
            call.enqueue(new Callback<JsonObject>() {
                @Override
                public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                    Log.d(TAG, "Response code: " + response.code());
                    JsonObject jsonObject = response.body();
                    Gson gson = new Gson();
                    TickerResponse tickerResponse;
                    Set<Map.Entry<String,JsonElement>> set = jsonObject.entrySet();
                    for (Map.Entry<String,JsonElement> obj : set) {
                        String key = obj.getKey();
                        if (jsonObject.get(key) != null) {
                            TickerPoint point = gson.fromJson(jsonObject.get(key).toString(), TickerPoint.class);
                            if (point != null && point.getServer_time() != 0) {
                                tickerResponse = new TickerResponse(key, point);
                                emitter.onNext(tickerResponse);
                                emitter.onComplete();
                                return;
                            }
                        }
                    }
                    emitter.onError(new Throwable("Error"));
                }
    
                @Override
                public void onFailure(Call<JsonObject> call, Throwable t) {
                    emitter.onError(t);
                }
            });
        });
    
    }