这可能太容易了,但我就是找不到解决方案。如何解析数组,其中有对象数组?这是我的示例 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 的情况下工作。我不知道这是否是最好的解决方案,但在我找到更好的解决方案之前,我会应用它。