有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Flexjson如何序列化包含映射的复杂层次结构

使用Flexjson,我试图序列化一个包含列表的对象(“负载”)。每个MyBean都有一个字段“items”,它是一个映射>;。当我序列化这个负载对象时,映射字段(“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);
}

}

有什么建议吗


共 (1) 个答案

  1. # 1 楼答案

    在尝试了很多东西之后,我找到了这个解决方案。 我为地图创建了一个自定义转换器。只是复制了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();
            }