gpt4 book ai didi

spring-mvc - JsonMappingException : Current token not START_OBJECT (needed to unwrap root name 'Transaction[]' ), 但 START_ARRAY

转载 作者:行者123 更新时间:2023-12-04 05:42:39 29 4
gpt4 key购买 nike

我正在使用 Spring 的 RestTemplate消费 Chargify API ,使用 JSON 作为有效负载格式。它一直很顺利,但是当我尝试获取一组对象时,它惨遭失败。例如,请考虑以下情况:

Transaction[] transactions = restTemplate.getForObject(
CHARGIFY_ENDPOINT + "/subscriptions/{subscription}/transactions.json",
Transaction[].class,
subscriptionId
);

实际的 GET 运行正常,JSON 响应为:
[ { "transaction" : { "amount_in_cents" : 3006,
"created_at" : "2012-06-17T16:32:05-04:00",
"ending_balance_in_cents" : 0,
"id" : 17283728,
"kind" : null,
"memo" : "",
"payment_id" : null,
"product_id" : 120387,
"subscription_id" : 1947292,
"success" : true,
"transaction_type" : "payment",
"type" : "Payment"
} },
{ "transaction" : { "amount_in_cents" : 5900,
"created_at" : "2012-06-17T16:32:05-04:00",
"ending_balance_in_cents" : 3006,
"id" : 17283727,
"kind" : "baseline",
"memo" : "Professional Plan (06/17/2012 - 07/17/2012)",
"payment_id" : 17283728,
"product_id" : 120387,
"subscription_id" : 1947292,
"success" : true,
"transaction_type" : "charge",
"type" : "Charge"
} },
{ "transaction" : { "amount_in_cents" : -2894,
"created_at" : "2012-06-17T16:32:03-04:00",
"ending_balance_in_cents" : -2894,
"id" : 17283726,
"kind" : "prorated",
"memo" : "",
"payment_id" : null,
"product_id" : 120387,
"subscription_id" : 1947292,
"success" : null,
"transaction_type" : "adjustment",
"type" : "Adjustment"
} },
{ "transaction" : { "amount_in_cents" : 2900,
"created_at" : "2012-06-17T15:17:07-04:00",
"ending_balance_in_cents" : 0,
"id" : 17281084,
"kind" : null,
"memo" : "",
"payment_id" : null,
"product_id" : 120386,
"subscription_id" : 1947292,
"success" : true,
"transaction_type" : "payment",
"type" : "Payment"
} },
{ "transaction" : { "amount_in_cents" : 2900,
"created_at" : "2012-06-17T15:17:06-04:00",
"ending_balance_in_cents" : 2900,
"id" : 17281083,
"kind" : "baseline",
"memo" : "Standard Plan (06/17/2012 - 07/17/2012)",
"payment_id" : 17281084,
"product_id" : 120386,
"subscription_id" : 1947292,
"success" : true,
"transaction_type" : "charge",
"type" : "Charge"
} }
]

但是,当 Jackson 尝试反序列化 JSON 时,结果是 JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY :
16:59:12.651 [http-8080-1] DEBUG org.springframework.web.client.RestTemplate - GET request for "https://foobar.chargify.com/subscriptions/1947292/transactions.json" resulted in 200 (OK)
16:59:12.651 [http-8080-1] DEBUG org.springframework.web.client.RestTemplate - Reading [[Lcom.foobar.chargify.Transaction;] as "application/json;charset=utf-8" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@1ea8dbd]
16:59:12.662 [http-8080-1] DEBUG org.apache.http.wire - << "[{"transaction":{"type":"Payment","amount_in_cents":3006,"payment_id":null,"memo":"","id":17283728,"created_at":"2012-06-17T16:32:05-04:00","subscription_id":1947292,"kind":null,"ending_balance_in_cents":0,"success":true,"product_id":120387,"transaction_type":"payment"}},{"transaction":{"type":"Charge","amount_in_cents":5900,"payment_id":17283728,"memo":"Professional Plan (06/17/2012 - 07/17/2012)","id":17283727,"created_at":"2012-06-17T16:32:05-04:00","subscription_id":1947292,"kind":"baseline","ending_balance_in_cents":3006,"success":true,"product_id":120387,"transaction_type":"charge"}},{"transaction":{"type":"Adjustment","amount_in_cents":-2894,"payment_id":null,"memo":"","id":17283726,"created_at":"2012-06-17T16:32:03-04:00","subscription_id":1947292,"kind":"prorated","ending_balance_in_cents":-2894,"success":null,"product_id":120387,"transaction_type":"adjustment"}},{"transaction":{"type":"Payment","amount_in_cents":2900,"payment_id":null,"memo":"","id":17281084,"created_at":"2012-06-17T15:17:07-04:00","subscription_id":1947292,"kind":null,"ending_balance_in_cents":0,"success":true,"product_id":120386,"transaction_type":"payment"}},{"transaction":{"type":"Charge","amount_in_cents":2900,"payment_id":17281084,"memo":"Standard Plan (06/17/2012 - 07/17/2012)","id":17281083,"created_at":"2012-06-17T15:17:06-04:00","subscription_id":1947292,"kind":"baseline","ending_balance_in_cents":2900,"success":true,"product_id":120386,"transaction_type":"charge"}}]"
16:59:12.683 [http-8080-1] DEBUG org.apache.http.impl.conn.SingleClientConnManager - Releasing connection org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter@17ed710
16:59:12.684 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
16:59:12.686 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
16:59:12.686 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]

我之前和 Jackson 一起遇到过这个问题,经过几天的研究,我最终选择了一条不同的路线。这一次不是一个选项,我没有找到解决方案的运气。

有什么想法吗?我不在乎我得到的是数组还是 List回来。我也没有运气。

在阅读 Jackson 的文档时,我看到您应该可以将列表包装在哪里,即 new TypeReference<List<Transaction>>() ,但我也没有运气。

顺便说一句,由于 Chargify 如何格式化他们的 JSON 响应,我的 RestTemplate 配置了自定义 ObjectMapper 设置这些选项:
configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);

当我删除这些选项时,没有 JsonMappingException然而,结果 Transaction 的所有字段都会被抛出对象为空。

我也尝试添加此选项,但似乎没有帮助:
configure(DeserializationConfig.Feature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true);

最佳答案

您只需要在 Transaction 之上的另一种包装类型,也请删除 UNWRAP_ROOT_VALUE 选项。

这些类(class)将沿着这些路线:

public class TransactionHolder {
private Transaction transaction;
...
}

public class Transaction {
private String amount_in_cents;
private String created_at;
private int ending_balance_in_cents;
private int id;
private String kind;
private String memo;
private int payment_id;
private int product_id;
private int subscription_id;
private boolean success;
private String transaction_type;
private String type;
...
}

使用您的示例 json,以下内容对我很有效:
ObjectMapper mapper = new ObjectMapper();
InputStream is = this.getClass().getResourceAsStream("sample.json");
TransactionHolder[] holders = mapper.readValue(is,TransactionHolder[].class);

关于spring-mvc - JsonMappingException : Current token not START_OBJECT (needed to unwrap root name 'Transaction[]' ), 但 START_ARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075218/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com