gpt4 book ai didi

java - Flexjson - 如何序列化包括 Map 的复杂层次结构

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:02 26 4
gpt4 key购买 nike

使用 Flexjson ,我正在尝试序列化一个包含列表的对象(“有效负载”)。每个 MyBean 都有一个字段“items”,它是一个 Map>。当我序列化此 Payload 对象时,映射字段(“items”)为空。

public class Payload {

private List<MyBean> myBeans = new ArrayList<MyBean>();

//the JSON returned has blank values for myBeans.values.items
public String toJson() {
return new JSONSerializer()
.exclude("*.class")
.include("myBeans")
.serialize(this);
}

但是,当我直接序列化 MyBean 对象时,它工作正常。

public class MyBean {

private Map<String, List<SomeBean>> items = new HashMap<String, List<SomeBean>>();

//this works
public String toJson() {
return new JSONSerializer()
.exclude("*.class")
.deepSerialize(this);
}

有什么建议吗?

最佳答案

在尝试了很多东西之后,我找到了这个解决方案。我为 map 创建了一个自定义转换器。只是复制了 Flexjson MapTransformer 并注释掉了一个 IF 条件。新代码如下

public class Payload {

private List<MyBean> myBeans = new ArrayList<MyBean>();

//the JSON returned has blank values for myBeans.values.items
public String toJson() {
return new JSONSerializer()
.exclude("*.class")
.include("myBeans")
.transform(new SOMapTransformer(), Map.class)
.serialize(this);
}
}


public class MyBean {

private Map<String, List<SomeBean>> items = new HashMap<String, List<SomeBean>>();

//this works
public String toJson() {
return new JSONSerializer()
.exclude("*.class")
.transform(new SOMapTransformer(), "items")
.deepSerialize(this);
}
}

这是自定义的 SOMapTransformer:

import com.mycompany.mypackage.SomeBean;

import flexjson.JSONContext;
import flexjson.Path;
import flexjson.TypeContext;
import flexjson.transformer.AbstractTransformer;
import flexjson.transformer.TransformerWrapper;

public class SOMapTransformer extends AbstractTransformer {

public void transform(Object object) {
JSONContext context = getContext();
Path path = context.getPath();
Map<String, List<SomeBean>> value = (Map<String, List<SomeBean>>) object;

TypeContext typeContext = getContext().writeOpenObject();
for (Object key : value.keySet()) {
path.enqueue((String) key);

//DPD 2013-11-04: This bloody line of code cost me 12 hours. Comment it out!
// if (context.isIncluded((String) key, value.get(key))) {

TransformerWrapper transformer = (TransformerWrapper)context.getTransformer(value.get(key));

if(!transformer.isInline()) {
if (!typeContext.isFirst()) getContext().writeComma();
typeContext.setFirst(false);
getContext().writeName(key.toString());
}

typeContext.setPropertyName(key.toString());

transformer.transform(value.get(key));

// }

path.pop();

}
getContext().writeCloseObject();
}

关于java - Flexjson - 如何序列化包括 Map 的复杂层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836821/

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