Java JSON 字符串到对象
Posted
技术标签:
【中文标题】Java JSON 字符串到对象【英文标题】:Java JSON String to Objects 【发布时间】:2021-12-31 16:48:06 【问题描述】:我在 Spring Boot 应用程序中从 pandas 收到以下格式的 JSON:
\"Ticker\":\"0\":\"GGB\",\"1\":\"CRD-B\",\"2\":\"QIWI\",\"3\":\"VIPS\",\"4\":\"PRDO\",\"5\":\"VALE\",\"6\":\"TCS\",\"7\":\"LL\",\"8\":\"ETD\",\"9\":\"PRIM\",\"10\":\"SNDR\",\"11\":\"MDU\",\"12\":\"CMC\",\"13\":\"TX\",\"14\":\"FOXA\",\"15\":\"EBS\",\"16\":\"SAGE\",\"Price\":\"0\":4.38,\"1\":7.93,\"2\":8.3,\"3\":10.04,\"4\":10.54,\"5\":11.45,\"6\":12.82,\"7\":17.23,\"8\":24.06,\"9\":25.14,\"10\":25.76,\"11\":28.47,\"12\":35.07,\"13\":38.02,\"14\":38.99,\"15\":40.07,\"16\":40.9,\"total_multiplier\":\"0\":1,\"1\":1,\"2\":1,\"3\":1,\"4\":2,\"5\":2,\"6\":1,\"7\":1,\"8\":2,\"9\":2,\"10\":2,\"11\":2,\"12\":1,\"13\":1,\"14\":2,\"15\":2,\"16\":2
然后我尝试从该字符串中获取数据,但是以下
String tickersList =
Objects.requireNonNull(fastAPIService.localApiClient().get().uri("/finmine/").retrieve().bodyToMono(String.class).block());
tickersList = tickersList.substring(1, tickersList.length() - 1);
JSONObject tickersObject = new JSONObject(tickersList);
JSONArray tickersArray = new JSONArray(tickersObject);
final int n = tickersArray.length();
for (int i = 0; i < n; ++i)
final JSONObject ticker = tickersArray.getJSONObject(i);
System.out.println(ticker.getString("Ticker"));
System.out.println(ticker.getFloat("total_multiplier"));
投掷
org.json.JSONException: 缺少值 1 [字符 2 第 1 行]
我从字符串中减去 ",因为 fastapi 客户端将它作为字符串发送给我;我尝试在字符串的开头和结尾添加方括号,但随后它会抛出一个错误,即字符处缺少值 ":" 654
如果我想稍后用它创建以下类的对象,我应该如何以正确的方式读取该 JSON?
public class Ticker
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String Ticker;
private Double Price;
private Double total_multiplier;
【问题讨论】:
那些转义字符会弄乱你的字符串。 首先,JSON 字符串无效(但您可以通过将反斜杠字符替换为空字符串使其有效)。其次,JSON 字符串不包含任何 JSON 数组。 另外,Price、Ticker 和 total_multipliers 必须是带有名称从 0 到 16 的字符串变量的 java 对象。 我怀疑这个错误实际上是你自己的代码在抑制 JSON。你的第一行是做什么的。您应该做什么而不是直接编组到String
或 Ticker
或 Map
而不是编组到字符串。恕我直言,您正在解决一个不存在但您自己创造的问题。
【参考方案1】:
感谢大家的回复,问题出在我的 python 客户端的初始响应中,我将 DataFrame 转换为 json,但它不是有效的 JSON 字符串,并使用以下代码将其发送到 Spring 应用程序:
return df.to_json()
我将其替换为以下代码:
return json.loads(df.to_json(orient='records', force_ascii=False))
是什么将我的回复格式从我的问题变成了这样:
["Ticker":"GGB","Price":4.38,"total_multiplier":1,"Ticker":"CRD-B","Price":7.93,"total_multiplier":1,"Ticker":"SAGE","Price":40.9,"total_multiplier":2]
之后是以下代码:
String tickersList = Objects.requireNonNull(fastAPIService.localApiClient().get().uri("/finmine/").retrieve().bodyToMono(String.class).block());
JSONArray tickersArray = new JSONArray(tickersList);
final int n = tickersArray.length();
for (int i = 0; i < n; ++i)
final JSONObject ticker = tickersArray.getJSONObject(i);
System.out.println(ticker.getString("Ticker"));
System.out.println(ticker.getFloat("total_multiplier"));
开始工作,我能够读取我需要的所有数据,再次感谢您指出无效的 JSON 字符串格式!
【讨论】:
以上是关于Java JSON 字符串到对象的主要内容,如果未能解决你的问题,请参考以下文章
JSON-JSON字符串转换成JSON对象JSON对象数组java实体类以及保存到List列表中
Spark 将 JSON 字符串转换为 JSON 对象(Java)