RestTemplate - Jackson 反序列化器
RestTemplate - Jackson Deserializer
我正在尝试使用 RestTemplate 使用 REST 服务。我在反序列化 JSON 响应时遇到问题。我正在使用自定义反序列化器,我的 JSON 有 3 个节点,但看起来只有一个正在到达反序列化器。以下是更多详细信息。
下面是回复JSON:
{
"Hello": {
"Hi": "Name1",
"Call": "PhoneNumber1"
},
"Hello": {
"Hi": "Name2",
"Call": "PhoneNumber2"
},
"Hello": {
"Hi": "Name3",
"Call": "PhoneNumber3"
}
}
我正在使用 @JsonDeserializer.
对属性 Hello 的响应 Class 使用自定义反序列化器
当我执行如下所示的 readTree 时:
JsonNode node = jp.getCodec().readTree(jp);
它到达了反序列化方法,看起来它只有一个节点而不是下面的 3 个节点。有时它有第一个节点,有时有最后一个。这里可能出了什么问题?
提前感谢您查看此问题并提供帮助!
回答:
正如其他人提到的,这个 JSON 是无效的,因此杰克逊无法反序列化它。我必须将响应作为字符串获取,然后手动反序列化。
这很可能是因为它无效 JSON,您不能拥有三个同名的节点。
或者严格来说这不是错误,但只有一个名为 "Hello" 的项目会被计入 as stated in this answer,这很糟糕,因为 json 不保证对象中项目的顺序,只保证列表中项目的顺序。
如果您可以更改响应,我会转而创建一个对象数组。
{
"Hello": [
{
"Hi": "Name1",
"Call": "PhoneNumber1"
},
{
"Hi": "Name2",
"Call": "PhoneNumber2"
},
{
"Hi": "Name3",
"Call": "PhoneNumber3"
}
]
}
然后你会得到一个 JsonNode,它是一个 JsonNodes 数组,你可以对其进行迭代。
JsonNode
是没有特定内容行为的超类。在您的示例中,您应该得到一个 ObjectNode
但由于您的所有属性都具有相同的名称,因此只有一个 "Hello" 属性 将保留。 readTree()
是一种通用方法,如果可能,它会自动转换为您需要的 return 类型。
如果你真的需要这个,你必须将你的 JSON 移动到数组结构:
// you will get one ArrayNode containing multiple ObjectNode
[
{
"Hello": {
"Hi": "Name1",
"Call": "PhoneNumber1"
}
},
{
"Hello": {
"Hi": "Name2",
"Call": "PhoneNumber2"
}
},
{
"Hello": {
"Hi": "Name3",
"Call": "PhoneNumber3"
}
}
]
或
// you will get one ObjectNode containing one property with an ArrayNode
{
"Hello": [
{
"Hi": "Name1",
"Call": "PhoneNumber1"
},
{
"Hi": "Name2",
"Call": "PhoneNumber2"
},
{
"Hi": "Name3",
"Call": "PhoneNumber3"
}
]
}
我正在尝试使用 RestTemplate 使用 REST 服务。我在反序列化 JSON 响应时遇到问题。我正在使用自定义反序列化器,我的 JSON 有 3 个节点,但看起来只有一个正在到达反序列化器。以下是更多详细信息。
下面是回复JSON:
{
"Hello": {
"Hi": "Name1",
"Call": "PhoneNumber1"
},
"Hello": {
"Hi": "Name2",
"Call": "PhoneNumber2"
},
"Hello": {
"Hi": "Name3",
"Call": "PhoneNumber3"
}
}
我正在使用 @JsonDeserializer.
对属性 Hello 的响应 Class 使用自定义反序列化器当我执行如下所示的 readTree 时:
JsonNode node = jp.getCodec().readTree(jp);
它到达了反序列化方法,看起来它只有一个节点而不是下面的 3 个节点。有时它有第一个节点,有时有最后一个。这里可能出了什么问题?
提前感谢您查看此问题并提供帮助!
回答: 正如其他人提到的,这个 JSON 是无效的,因此杰克逊无法反序列化它。我必须将响应作为字符串获取,然后手动反序列化。
这很可能是因为它无效 JSON,您不能拥有三个同名的节点。
或者严格来说这不是错误,但只有一个名为 "Hello" 的项目会被计入 as stated in this answer,这很糟糕,因为 json 不保证对象中项目的顺序,只保证列表中项目的顺序。
如果您可以更改响应,我会转而创建一个对象数组。
{
"Hello": [
{
"Hi": "Name1",
"Call": "PhoneNumber1"
},
{
"Hi": "Name2",
"Call": "PhoneNumber2"
},
{
"Hi": "Name3",
"Call": "PhoneNumber3"
}
]
}
然后你会得到一个 JsonNode,它是一个 JsonNodes 数组,你可以对其进行迭代。
JsonNode
是没有特定内容行为的超类。在您的示例中,您应该得到一个 ObjectNode
但由于您的所有属性都具有相同的名称,因此只有一个 "Hello" 属性 将保留。 readTree()
是一种通用方法,如果可能,它会自动转换为您需要的 return 类型。
如果你真的需要这个,你必须将你的 JSON 移动到数组结构:
// you will get one ArrayNode containing multiple ObjectNode
[
{
"Hello": {
"Hi": "Name1",
"Call": "PhoneNumber1"
}
},
{
"Hello": {
"Hi": "Name2",
"Call": "PhoneNumber2"
}
},
{
"Hello": {
"Hi": "Name3",
"Call": "PhoneNumber3"
}
}
]
或
// you will get one ObjectNode containing one property with an ArrayNode
{
"Hello": [
{
"Hi": "Name1",
"Call": "PhoneNumber1"
},
{
"Hi": "Name2",
"Call": "PhoneNumber2"
},
{
"Hi": "Name3",
"Call": "PhoneNumber3"
}
]
}