【问题标题】:how to handle json response (2D array)?如何处理 json 响应(二维数组)?
【发布时间】:2022-01-22 14:19:27
【问题描述】:

大家好, 我正在尝试解决来自:https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=2

的 api 响应

响应包含 Pojo24 类的二维数组(见下文) 我想将 api 的响应获取到 Pojo24.class 中(包括 getter 和 setter)。所以最后我想把它放到一个数据库中。 我尝试使用 Gson.class,不幸的是它没有成功。有没有人可以带我一起解决?提前Tnx!

   public class Pojo24{
private Long id;
    private Long openTime;
    private String open;
    private String high;
    private String low;
    private String close;
    private String volume;
    private Long closeTime;
    private String quoteAssesVolume;
    private Long numberOfTrades;
    private String tbbav;  //taker buy base asset volume
    private String tbqav;  //taker buy quote asset volume
    private String ignore;
}

package com.example.Binance24hr;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Binance24hrApplication {

    public static void main(String[] args) {
        SpringApplication.run(Binance24hrApplication.class, args);

        
        String url = "https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=2";
        Gson gson = new Gson();
        List<Object[]> result = gson.fromJson(url, new TypeToken<ArrayList<Object[]>>(){}.getType());

        List<Pojo24> pojo24List = result.stream()
                .map(e -> {
                    Pojo24 pojo24 = new Pojo24();
                   // pojo24.setId(new Double((Double) e[0]).longValue());
                    pojo24.setOpenTime(new Double((String) e[1]).longValue());
                    pojo24.setOpen((String) e[2]);
                    pojo24.setHigh((String) e[3]);
                    pojo24.setLow((String) e[4]);
                    pojo24.setClose((String) e[5]);
                    pojo24.setVolume(String.valueOf(e[6]));
                    pojo24.setCloseTime(new Double((String) e[7]).longValue());
                    pojo24.setQuoteAssesVolume(String.valueOf(e[8]));
                    pojo24.setNumberOfTrades(new Double((String) e[9]).longValue());
                    pojo24.setTbbav((String) e[10]);
                    pojo24.setTbqav((String) e[11]);
                    // pojo24.setIgnore((String) e[12])
                    return pojo24;
                })
                .collect(Collectors.toList());
    }
}

当我运行这个时,我得到了以下异常:

2022-01-27 19:33:15.661 信息 10168 --- [主要] c.e.Binance24hr.Binance24hrApplication : 已启动 Binance24hrApplication in 7.669 seconds (JVM running for 9.848) 线程“主”com.google.gson.JsonSyntaxException 中的异常: java.lang.IllegalStateException:应为 BEGIN_ARRAY 但为 STRING 在第 1 行第 1 列路径 $ 在 com.google.gson.Gson.fromJson(Gson.java:939) 在 com.google.gson.Gson.fromJson(Gson.java:892) 在 com.google.gson.Gson.fromJson(Gson.java:841) 在 com.example.Binance24hr.Binance24hrApplication.main(Binance24hrApplication.java:20) 引起:java.lang.IllegalStateException:预期 BEGIN_ARRAY 但 在第 1 行第 1 列路径 $ 处为 STRING com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 在 com.google.gson.Gson.fromJson(Gson.java:927) ... 3 更多

【问题讨论】:

  • 您好,我访问了您发布的 URL,在嵌套的 JSON 数组中只能找到 12 个元素,但您的 Pojo24 类中有 13 个字段。

标签: java json spring api


【解决方案1】:

正如我在 OP 下评论的那样,我只能在给定 API 响应的嵌套 JSON 数组中找到 12 个元素,但 Pojo24 类中有 13 个字段。所以,我假设最后一个字段 ignore 可以忽略,您可以先将响应 JSON 字符串反序列化为 Object 数组列表,然后将每个字段分配给您的类 Pojo24,如下所示:

Gson gson = new Gson();
List<Object[]> result = gson.fromJson(jsonStr, new TypeToken<ArrayList<Object[]>>(){}.getType());

List<Pojo24> pojo24List = result.stream()
        .map(e -> {
            Pojo24 pojo24 = new Pojo24();
            pojo24.setId(new Double((Double) e[0]).longValue());
            pojo24.setOpenTime(new Double((String) e[1]).longValue());
            pojo24.setOpen((String) e[2]);
            pojo24.setHigh((String) e[3]);
            pojo24.setLow((String) e[4]);
            pojo24.setClose((String) e[5]);
            pojo24.setVolume(String.valueOf(e[6]));
            pojo24.setCloseTime(new Double((String) e[7]).longValue());
            pojo24.setQuoteAssesVolume(String.valueOf(e[8]));
            pojo24.setNumberOfTrades(new Double((String) e[9]).longValue());
            pojo24.setTbbav((String) e[10]);
            pojo24.setTbqav((String) e[11]);
            // pojo24.setIgnore((String) e[12])
            return pojo24;
        })
        .collect(Collectors.toList());

【讨论】:

  • 感谢您的回复。当我试图将 URL 放入字符串中时,例如: String url = "api.binance.com/api/v3/…";并将其作为参数传入参数 jsonStr 运行 main 方法时出现以下异常:线程“main”com.google.gson.JsonSyntaxException 中的异常:java.lang.IllegalStateException:预期的 BEGIN_ARRAY 但在第 1 行是 STRING第 1 列路径 $ 我在做什么错? tnx
  • 您得到的响应似乎是 JSON 对象而不是 JSON 数组。您能否也发布响应的部分内容?
  • 整个响应是:
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2014-07-13
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多