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。你的第一行是做什么的。您应该做什么而不是直接编组到 StringTickerMap 而不是编组到字符串。恕我直言,您正在解决一个不存在但您自己创造的问题。 【参考方案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)

json字符串怎么转换为java对象

GWT 客户端:Java 对象到 json 字符串,反之亦然

Java对象与JSON字符串的互转

如何将json字符串转成带有对象引用的java对象