Java 子类反序列化的jackson列表
我正在开发一个Web服务,在这里我应该提供xml作为响应,为此我使用jackson。我被一个问题困住了,我有一个抽象类:Java 子类反序列化的jackson列表,java,xml,jackson,Java,Xml,Jackson,我正在开发一个Web服务,在这里我应该提供xml作为响应,为此我使用jackson。我被一个问题困住了,我有一个抽象类: package com.spinner.jackson; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonUnwrapped;
package com.spinner.jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
public class ClientObject {
@JacksonXmlElementWrapper(useWrapping = false)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
private List<MyItem> accounts;
public ClientObject(List<MyItem> pl) {
this.accounts = pl;
}
public ClientObject() {
this.accounts = new ArrayList<MyItem>();
}
@JsonDeserialize(using = CustomDeserial.class)
public void setL(List<MyItem> l) {
this.accounts = l;
}
public List<MyItem> getAccounts() {
// TODO Auto-generated method stub
return this.accounts;
}
}
另一个子类
package com.spinner.jackson;
import javax.xml.bind.annotation.XmlRootElement;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName="itemB")
public class MySubItemB extends MyItem {
private int itemBProperty1;
private String itemBProperty2;
public int getItemBProperty1() {
return this.itemBProperty1;
}
public void setItemBProperty1(int itemBProperty1) {
this.itemBProperty1 = itemBProperty1;
}
public String getItemBProperty2() {
return this.itemBProperty2;
}
public void setItemBProperty2(String itemBProperty2) {
this.itemBProperty2 = itemBProperty2;
}
public MySubItemB(@JsonProperty("id")int id, @JsonProperty("name")String name, @JsonProperty("itemBProperty1")int p1, @JsonProperty("itemBProperty2")String p2) {
super(id, name);
this.itemBProperty1 = p1;
this.itemBProperty2 = p2;
}
}
和一个客户端类,如下所示:
package com.spinner.jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
public class ClientObject {
@JacksonXmlElementWrapper(useWrapping = false)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
private List<MyItem> accounts;
public ClientObject(List<MyItem> pl) {
this.accounts = pl;
}
public ClientObject() {
this.accounts = new ArrayList<MyItem>();
}
@JsonDeserialize(using = CustomDeserial.class)
public void setL(List<MyItem> l) {
this.accounts = l;
}
@JsonDeserialize(using = CustomDeserial.class)
public List<MyItem> getAccounts() {
// TODO Auto-generated method stub
return this.accounts;
}
}
如上所述,生成输出xml,如下所示
<ClientObject>
<accounts>
<MySubItemA>
....
</MySubItemA>
</accounts>
<accounts>
<MySubItemB>
....
</MySubItemB>
</accounts>
</ClientObject>
<ClientObject>
<accounts>
<accounts>
<MySubItemA>
....
</MySubItemA>
</accounts>
<accounts>
<MySubItemB>
.....
</MySubItemB>
</accounts>
</accounts>
</ClientObject>
....
....
即使我正在使用@JacksonXmlElementWrapper(useWrapping=false),是否有办法删除
包装器?如果我删除此注释,它会执行以下操作
<ClientObject>
<accounts>
<MySubItemA>
....
</MySubItemA>
</accounts>
<accounts>
<MySubItemB>
....
</MySubItemB>
</accounts>
</ClientObject>
<ClientObject>
<accounts>
<accounts>
<MySubItemA>
....
</MySubItemA>
</accounts>
<accounts>
<MySubItemB>
.....
</MySubItemB>
</accounts>
</accounts>
</ClientObject>
....
.....
所以最终的输出应该是
<ClientObject>
<MySubItemA>
....
</MySubItemA>
<MySubItemB>
....
</MySubItemB>
</ClientObject>
....
....
谢谢你的帮助
致意
萨吉德我能够找到答案,因此我认为它可能会帮助其他人: 我创建了序列化程序
package com.spinner.jackson;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class MySerial extends JsonSerializer<ClientObject>
{
public void serialize(ClientObject value, JsonGenerator jgen,
SerializerProvider provider)
throws IOException, JsonProcessingException
{
jgen.writeObjectFieldStart(value.getClass().getSimpleName());
jgen.writeObjectField(value.getAccounts().get(0).getClass().getSimpleName(), value.getAccounts().get(0));
jgen.writeObjectField(value.getAccounts().get(1).getClass().getSimpleName(), value.getAccounts().get(1));
jgen.writeObjectField(value.getAccounts().get(2).getClass().getSimpleName(), value.getAccounts().get(2));
jgen.writeObjectField(value.getAccounts().get(3).getClass().getSimpleName(), value.getAccounts().get(3));
}
}
package com.spinner.jackson;
导入java.io.IOException;
导入com.fasterxml.jackson.core.JsonGenerator;
导入com.fasterxml.jackson.core.JsonProcessingException;
导入com.fasterxml.jackson.databind.JsonSerializer;
导入com.fasterxml.jackson.databind.SerializerProvider;
公共类MySerial扩展JsonSerializer
{
public void序列化(ClientObject值,JsonGenerator jgen,
序列化提供程序(提供程序)
抛出IOException、JsonProcessingException
{
writeObjectFieldStart(value.getClass().getSimpleName());
writeObject字段(value.getAccounts().get(0.getClass().getSimpleName(),value.getAccounts().get(0));
writeObject字段(value.getAccounts().get(1.getClass().getSimpleName(),value.getAccounts().get(1));
writeObject字段(value.getAccounts().get(2.getClass().getSimpleName(),value.getAccounts().get(2));
writeObject字段(value.getAccounts().get(3.getClass().getSimpleName(),value.getAccounts().get(3));
}
}
接下来我在ClientObject.java中做了以下工作:
package com.spinner.jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
@JsonSerialize(using = CustomDeserial.class)
public class ClientObject {
@JacksonXmlElementWrapper(useWrapping = false)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
private List<MyItem> accounts;
public ClientObject(List<MyItem> pl) {
this.accounts = pl;
}
public ClientObject() {
this.accounts = new ArrayList<MyItem>();
}
public void setL(List<MyItem> l) {
this.accounts = l;
}
public List<MyItem> getAccounts() {
return this.accounts;
}
}
package com.spinner.jackson;
导入java.util.ArrayList;
导入java.util.List;
导入com.fasterxml.jackson.annotation.JsonTypeInfo;
导入com.fasterxml.jackson.databind.annotation.JsonSerialize;
导入com.fasterxml.jackson.dataformat.xml.annotation.jacksonxmlementwrapper;
@JsonSerialize(使用=CustomDeserial.class)
公共类ClientObject{
@JacksonXmlElementWrapper(useWrapping=false)
@JsonTypeInfo(使用=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER\u对象)
私人名单账户;
公共客户端对象(列表pl){
这个账户=pl;
}
公共客户端对象(){
this.accounts=new ArrayList();
}
公共无效setL(列表l){
这是我的账户=l;
}
公共帐户列表(){
归还此帐户;
}
}
瞧,它成功了,希望这能帮助一些人。我能弄明白,所以我认为它可能会帮助其他人: 我创建了序列化程序
package com.spinner.jackson;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class MySerial extends JsonSerializer<ClientObject>
{
public void serialize(ClientObject value, JsonGenerator jgen,
SerializerProvider provider)
throws IOException, JsonProcessingException
{
jgen.writeObjectFieldStart(value.getClass().getSimpleName());
jgen.writeObjectField(value.getAccounts().get(0).getClass().getSimpleName(), value.getAccounts().get(0));
jgen.writeObjectField(value.getAccounts().get(1).getClass().getSimpleName(), value.getAccounts().get(1));
jgen.writeObjectField(value.getAccounts().get(2).getClass().getSimpleName(), value.getAccounts().get(2));
jgen.writeObjectField(value.getAccounts().get(3).getClass().getSimpleName(), value.getAccounts().get(3));
}
}
package com.spinner.jackson;
导入java.io.IOException;
导入com.fasterxml.jackson.core.JsonGenerator;
导入com.fasterxml.jackson.core.JsonProcessingException;
导入com.fasterxml.jackson.databind.JsonSerializer;
导入com.fasterxml.jackson.databind.SerializerProvider;
公共类MySerial扩展JsonSerializer
{
public void序列化(ClientObject值,JsonGenerator jgen,
序列化提供程序(提供程序)
抛出IOException、JsonProcessingException
{
writeObjectFieldStart(value.getClass().getSimpleName());
writeObject字段(value.getAccounts().get(0.getClass().getSimpleName(),value.getAccounts().get(0));
writeObject字段(value.getAccounts().get(1.getClass().getSimpleName(),value.getAccounts().get(1));
writeObject字段(value.getAccounts().get(2.getClass().getSimpleName(),value.getAccounts().get(2));
writeObject字段(value.getAccounts().get(3.getClass().getSimpleName(),value.getAccounts().get(3));
}
}
接下来我在ClientObject.java中做了以下工作:
package com.spinner.jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
@JsonSerialize(using = CustomDeserial.class)
public class ClientObject {
@JacksonXmlElementWrapper(useWrapping = false)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
private List<MyItem> accounts;
public ClientObject(List<MyItem> pl) {
this.accounts = pl;
}
public ClientObject() {
this.accounts = new ArrayList<MyItem>();
}
public void setL(List<MyItem> l) {
this.accounts = l;
}
public List<MyItem> getAccounts() {
return this.accounts;
}
}
package com.spinner.jackson;
导入java.util.ArrayList;
导入java.util.List;
导入com.fasterxml.jackson.annotation.JsonTypeInfo;
导入com.fasterxml.jackson.databind.annotation.JsonSerialize;
导入com.fasterxml.jackson.dataformat.xml.annotation.jacksonxmlementwrapper;
@JsonSerialize(使用=CustomDeserial.class)
公共类ClientObject{
@JacksonXmlElementWrapper(useWrapping=false)
@JsonTypeInfo(使用=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER\u对象)
私人名单账户;
公共客户端对象(列表pl){
这个账户=pl;
}
公共客户端对象(){
this.accounts=new ArrayList();
}
公共无效setL(列表l){
这是我的账户=l;
}
公共帐户列表(){
归还此帐户;
}
}
瞧,它成功了,希望这能帮助一些人。你错过了抽象类MyItem。谢谢,更新的问题你错过了抽象类MyItem。谢谢,更新的问题