0

这可能太容易了,但我就是找不到解决方案。如何解析数组,其中有对象数组?这是我的示例 Json

{  
   "status":"Ok",
   "items":[  
      [  
         "1530871200000",
         {  
            "o":"24174.11",
            "c":"24320.92",
            "h":"24350",
            "l":"24170.08",
            "v":"61.75980004"
         }
      ],
      [  
         "1530878400000",
         {  
            "o":"24322.74",
            "c":"24308.52",
            "h":"24632.36",
            "l":"24300",
            "v":"98.16061555"
         }
      ],
      [  
         "1530885600000",
         {  
            "o":"24367.16",
            "c":"24450",
            "h":"24450",
            "l":"24290.13",
            "v":"56.9420044"
         }
      ],
      [  
         "1530892800000",
         {  
            "o":"24427.73",
            "c":"24413.87",
            "h":"24542.69",
            "l":"24356.91",
            "v":"81.64183111"
         }
      ],
      [  
         "1530900000000",
         {  
            "o":"24472.81",
            "c":"24275",
            "h":"24538",
            "l":"24215.72",
            "v":"75.40993175"
         }
      ],
      [  
         "1530907200000",
         {  
            "o":"24275",
            "c":"24420",
            "h":"24461.61",
            "l":"24249.42",
            "v":"53.58580779"
         }
      ],
      [  
         "1530914400000",
         {  
            "o":"24420",
            "c":"24437",
            "h":"24538.11",
            "l":"24293.91",
            "v":"53.87857788"
         }
      ],
      [  
         "1530921600000",
         {  
            "o":"24437",
            "c":"24413.82",
            "h":"24449.11",
            "l":"24411.13",
            "v":"0.48062667"
         }
      ],
      [  
         "1530928800000",
         {  
            "o":"24414.05",
            "c":"24494.37",
            "h":"24505.7",
            "l":"24293.9",
            "v":"15.75597079"
         }
      ],
      [  
         "1530936000000",
         {  
            "o":"24500",
            "c":"24486.86",
            "h":"24500",
            "l":"24459.25",
            "v":"2.34557367"
         }
      ],
      [  
         "1530943200000",
         {  
            "o":"24486.86",
            "c":"24482",
            "h":"24531.43",
            "l":"24434.04",
            "v":"60.734314"
         }
      ],
      [  
         "1530950400000",
         {  
            "o":"24549.38",
            "c":"24444",
            "h":"24583",
            "l":"24406.13",
            "v":"56.25116508"
         }
      ]
   ]
}

“1530871200000”这个值是随机的。以前,当我使用对象 {} 解析 Json 时,我只使用了 POJO 类 + gson。现在我无法处理数组,其中有对象数组。下面我粘贴了我想用这个 Json 控制的 Pojo。

图表.java

private void Chart(String cryptoCurrency, String fiatcurrency, int resolution, long from)
{
        BitBayInterface3 charts = BitBayInterface3.retrofitAPI3.create(BitBayInterface3.class);
        Call <Chart> call = charts.chartApi3(cryptoCurrency, fiatcurrency, resolution, from, System.currentTimeMillis());
        call.enqueue(new Callback <Chart>() {
            @Override
            public void onResponse(Call <Chart> call, Response <Chart> response)
            {
                List <ItemClass> itemClasses = new ArrayList<>();
                for (Map.Entry<String, ItemClass> entry : response.body().getItems().entrySet()) {
                    itemClasses.add(new ItemClass(entry.getKey(), entry.getValue().getO(), entry.getValue().getC(), entry.getValue().getH(), entry.getValue().getL(), entry.getValue().getV()));
                }
                Log.e(TAG, "CHART SERVICE response isSuccessful " + " body " + itemClasses.size());
            }
            @Override
            public void onFailure(@NonNull Call <Chart> call, Throwable t) {
                Log.e(TAG, "CHART SERVICE " + t);
            }
        });
}

项目类.java

public class ItemClass {
private String o;
private String c;
private String h;
private String l;
private String v;
private String timestamp;

public ItemClass(String timestamp, String o, String c, String h, String l, String v)
{
    this.timestamp = timestamp;
    this.o = o;
    this.c = c;
    this.h = h;
    this.l = l;
    this.v = v;
}

@JsonProperty("o")
public String getO() { return o; }
@JsonProperty("o")
public void setO(String value) { this.o = value; }

@JsonProperty("c")
public String getC() { return c; }
@JsonProperty("c")
public void setC(String value) { this.c = value; }

@JsonProperty("h")
public String getH() { return h; }
@JsonProperty("h")
public void setH(String value) { this.h = value; }

@JsonProperty("l")
public String getL() { return l; }
@JsonProperty("l")
public void setL(String value) { this.l = value; }

@JsonProperty("v")
public String getV() { return v; }
@JsonProperty("v")
public void setV(String value) { this.v = value; }

public String getTimestamp() {
    return timestamp;
}

public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
}
}

项目元素.java

public class ItemElement {
public ItemClass itemClassValue;
public String stringValue;

static class Deserializer extends JsonDeserializer<ItemElement> {
    @Override
    public ItemElement deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ItemElement value = new ItemElement();
        switch (jsonParser.getCurrentToken()) {
            case VALUE_STRING:
                value.stringValue = jsonParser.readValueAs(String.class);
                break;
            case START_OBJECT:
                value.itemClassValue = jsonParser.readValueAs(ItemClass.class);
                break;
            default: throw new IOException("Cannot deserialize ItemElement");
        }
        return value;
    }
}

static class Serializer extends JsonSerializer<ItemElement> {
    @Override
    public void serialize(ItemElement obj, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (obj.itemClassValue != null) {
            jsonGenerator.writeObject(obj.itemClassValue);
            return;
        }
        if (obj.stringValue != null) {
            jsonGenerator.writeObject(obj.stringValue);
            return;
        }
        throw new IOException("ItemElement must not be null");
    }
}
}

ChartConverter.java

public class ChartConverter {
// Serialize/deserialize helpers

public static Chart fromJsonString(String json) throws IOException {
    return getObjectReader().readValue(json);
}

public static String toJsonString(Chart obj) throws JsonProcessingException {
    return getObjectWriter().writeValueAsString(obj);
}

private static ObjectReader reader;
private static ObjectWriter writer;

private static void instantiateMapper() {
    ObjectMapper mapper = new ObjectMapper();
    reader = mapper.reader(Chart.class);
    writer = mapper.writerFor(Chart.class);
}

private static ObjectReader getObjectReader() {
    if (reader == null) instantiateMapper();
    return reader;
}

private static ObjectWriter getObjectWriter() {
    if (writer == null) instantiateMapper();
    return writer;
}
}

改造2无效

private void Chart(String cryptoCurrency, String fiatcurrency, int resolution, long from)
{
        BitBayInterface3 charts = BitBayInterface3.retrofitAPI3.create(BitBayInterface3.class);
        Call <Chart> call = charts.chartApi3(cryptoCurrency, fiatcurrency, resolution, from, System.currentTimeMillis());
        call.enqueue(new Callback <Chart>() {
            @Override
            public void onResponse(Call <Chart> call, Response <Chart> response)
            {
                try {
                    Chart data = ChartConverter.fromJsonString(new Gson().toJson(response.body().getItems()));
                    Log.e(TAG, "CHART SERVICE response isSuccessful " + " body " + data.getItems().length);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(@NonNull Call <Chart> call, Throwable t) {
                Log.e(TAG, "CHART SERVICE " + t);
            }
        });
}

和接口

public interface BitBayInterface3 {

String BASE_URL_API3 = "https://api.bitbay.net/rest/";

Retrofit retrofitAPI3 = new Retrofit.Builder()
        .baseUrl(BASE_URL_API3)
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .build();


@GET("trading/candle/history/{crypto}-{fiat}/{resolution}")
Call <Chart> chartApi3(
        @Path("crypto") String crypto,
        @Path("fiat") String fiat,
        @Path("resolution") int resolution,
        @Query("from") long from,
        @Query("to") long to
);}

这会拒绝以下错误“com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 27 path $.items[0][0]”

我需要一个chart.get(0).getObjectKey()形式的对象;或 chart.get(0).getC();

唯一不能完全工作的方法是将 ItemElement[][] 替换为 Map,但是我无法获取单个元素或随机生成的对象的键。

@编辑 13:19

它现在可以在没有 ItemElement 或 ChartConverter 的情况下工作。我不知道这是否是最好的解决方案,但在我找到更好的解决方案之前,我会应用它。

4

1 回答 1

3

itemsStringor的数组的数组ItemClass,因此它的类型必须是以下之一,因为andObject是唯一常见的类型:StringItemClass

  • Object[][]
  • List<List<Object>>
  • 以上其他组合

意见:这是一个设计糟糕的 JSON。如果您可以更改它,您应该执行以下操作之一:

  • 将内部数组更改为对象:

    "items":[  
          {  
             "a":"1530871200000",
             "b":{  
                "o":"24174.11",
                "c":"24320.92",
                "h":"24350",
                "l":"24170.08",
                "v":"61.75980004"
             }
          },
    
  • 将 array-array 更改为Map又名 JSON 对象(假设第一个值是唯一的):

    "items":{
          "1530871200000":{
                "o":"24174.11",
                "c":"24320.92",
                "h":"24350",
                "l":"24170.08",
                "v":"61.75980004"
          },
    
于 2018-07-14T19:28:16.423 回答