我有一个REST API,它返回JSON响应为:
{
"channel" : "JHBHS"
}
有时它返回:
{
"channel": {
"id": 12321,
"name": "Some channel"
}
}
我有一个像这样的POJO:
public class Event {
private String channel;
@JsonProperty("channel")
private Channel channelObj;
}
public class Channel {
private int id;
private String name;
}
那么,有没有一种方法(不是写你自己的其他 自定义解串器
中)Jackson2,这将有助于我映射channel
在JSON来String
时,它的A型String
和Channel
类型时,它是一个JSON对象?
或者换句话说,在Jackson中,有没有一种方法可以按type
变量而不是by 映射name
?
我可以建议您像这样使用JsonNode:
class Event {
@JsonProperty("channel")
private JsonNode channelInternal;
private Channel channel;
private String channelStr;
/**
* Custom getter with channel parsing
* @return channel
*/
public Channel getChannel() {
if (channel == null && channelInternal != null) {
if (channelInternal.isObject()) {
int id = channelInternal.get("id").intValue();
String name = channelInternal.get("name").asText();
channel = new Channel(id, name);
}
}
return channel;
}
/**
* Custom getter with channel string parsing
* @return channel string
*/
public String getChannelStr() {
if (channelStr == null && channelInternal != null) {
if (channelInternal.isTextual()) {
channelStr = channelInternal.asText();
}
}
return channelStr;
}
}
或像这样 :
class Event {
private Channel channel;
private String channelStr;
@JsonSetter("channel")
public void setChannelInternal(JsonNode channelInternal) {
if (channelInternal != null) {
if (channelInternal.isTextual()) {
channelStr = channelInternal.asText();
} else if (channelInternal.isObject()) {
int id = channelInternal.get("id").intValue();
String name = channelInternal.get("name").asText();
channel = new Channel(id, name);
}
}
}
public Channel getChannel() {
return channel;
}
public String getChannelStr() {
return channelStr;
}
}
但是我认为使用自定义解串器更为常见。
这是测试代码
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String source1 = "{\n" +
" \"channel\" : \"JHBHS\"\n" +
"}";
String source2 = "{\n" +
" \"channel\": {\n" +
" \"id\": 12321,\n" +
" \"name\": \"Some channel\"\n" +
" }\n" +
"}";
//Test object parsing
Event result = objectMapper.readValue(source2, Event.class);
System.out.println(String.format("%s : %s", result.getChannel().getId(), result.getChannel().getName()));
//Test string parsing
result = objectMapper.readValue(source1, Event.class);
System.out.println(result.getChannelStr());
}
并输出:
12321 : Some channel
JHBHS
我有一个REST API,它返回JSON响应为: 有时它会返回: 我有一个这样的POJO: 那么,有没有办法(除了编写自己的自定义反序列化程序)在 Jackson2 中帮助我将 JSON 中的通道映射到字符串类型(当它是时)和类型(当它是 JSON 对象时)? 或者换句话说,Jackson中是否有一种方法可以通过变量的映射,而不仅仅是通过?
我想实现一个功能,其中请求映射到正确的对象。是否有一种方法(除了自定义反序列化器)可以将请求按类型/基数映射到适当的对象?任何见解都将不胜感激!
问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定
问题内容: 我有一个Animal类和一个名为AnimalExtension的Animal扩展。 这两个类之间的唯一区别是AnimalExtension还有另一个实例变量叫做animalId。Animal没有此实例变量。 我也有自己的数据类型,想要对XML进行封送处理。此数据类型称为AnimalList。在AnimalList内,有一个Animals列表作为实例变量。 animalList可以包含A
问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文
但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会