Spring Boot如何解析pandas导出的JSON并映射为Ticker实体对象
问题根因
你拿到的JSON是pandas默认orient='columns'参数输出的列优先结构,格式为「字段名 -> {索引: 对应行值}」的映射,本身不是JSON数组,强行转JSONArray必然报错,随意裁剪字符串、手动加方括号的操作也不符合JSON规范,完全没有必要。
最优解决方案(改FastAPI侧输出,后续解析零额外成本)
pandas输出JSON时指定orient参数为records即可直接输出行优先的数组格式,FastAPI侧代码调整为:
# 假设df是你的pandas DataFrame对象 return df.to_json(orient='records')
调整后输出的JSON格式如下,完全匹配你需要的Ticker结构:
[{"Ticker":"GGB","Price":4.38,"total_multiplier":1},{"Ticker":"CRD-B","Price":7.93,"total_multiplier":1},...]
Spring Boot侧直接用WebClient自带的Jackson反序列化即可,无需手动解析JSON:
import java.util.List; // 直接反序列化为Ticker对象集合 List<Ticker> tickers = Objects.requireNonNull(fastAPIService.localApiClient().get() .uri("/finmine/") .retrieve() .bodyToFlux(Ticker.class) .collectList() .block());
注意给你的Ticker类补充无参构造方法、对应字段的getter/setter,也可以直接加Lombok的@Data注解简化代码。
兼容方案(不改FastAPI,直接解析现有JSON)
如果无法调整上游接口输出,直接按现有结构手动解析即可,不要裁剪原始返回的JSON字符串:
import org.json.JSONObject; import java.util.ArrayList; import java.util.List; String rawJson = Objects.requireNonNull(fastAPIService.localApiClient().get() .uri("/finmine/") .retrieve() .bodyToMono(String.class) .block()); JSONObject root = new JSONObject(rawJson); JSONObject tickerMap = root.getJSONObject("Ticker"); JSONObject priceMap = root.getJSONObject("Price"); JSONObject multiplierMap = root.getJSONObject("total_multiplier"); List<Ticker> tickerList = new ArrayList<>(); int size = tickerMap.keySet().size(); for (int i = 0; i < size; i++) { String idx = String.valueOf(i); Ticker ticker = new Ticker(); ticker.setTicker(tickerMap.getString(idx)); ticker.setPrice(priceMap.getDouble(idx)); ticker.setTotal_multiplier(multiplierMap.getDouble(idx)); tickerList.add(ticker); }
注意事项
如果返回的JSON字符串外层带多余双引号,说明FastAPI接口返回的Content-Type不正确,应调整为application/json类型,不要手动裁剪字符串处理转义。
内容的提问来源于stack exchange,提问作者shelby
相关产品推荐
相关产品推荐

