Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JsonSerialize与HashMap_Java_Json_Jaxb - Fatal编程技术网

Java JsonSerialize与HashMap

Java JsonSerialize与HashMap,java,json,jaxb,Java,Json,Jaxb,我有以下java代码 @XmlRootElement public class PreferenceEntity { String type, name; int id; Map<String, String> attributes = new HashMap<String, String>(); List<PreferenceEntity> children; PreferenceEntity parent;

我有以下java代码

 @XmlRootElement
public class PreferenceEntity  {
    String type, name;
    int id;
    Map<String, String> attributes = new HashMap<String, String>();
    List<PreferenceEntity> children;
    PreferenceEntity parent;

    public PreferenceEntity() {
        parent = null;
    }

    public PreferenceEntity(PreferenceEntity parent) {
        this.parent = parent;
    }

    @XmlAnyElement
    public List<PreferenceEntity> getChildren() {
        return children;
    }
    public void setChildren(List<PreferenceEntity> children) {
        this.children = children;
    }

    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }

    @JsonSerialize(contentUsing=SubjectAutocompleteSerializer.class)
    public Map<String, String> getAttributes() {
        return attributes;
    }

    @XmlTransient
    public PreferenceEntity getParent() {
        return parent;
    }


    public void setName(String name) {
        this.name = name;
    }

    public void setId(int id) { 
        if (id >= 0) {
            this.id = id;
        }
    }

    // Internal class
    public static class SubjectAutocompleteSerializer extends JsonSerializer<Map<String, String>> {

        @Override
        public void serialize(Map<String, String> map, JsonGenerator jgen, SerializerProvider provider)
                throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            for (String key:map.keySet()) {
                jgen.writeStringField(key, map.get(key));
            }
            //jgen.writeFieldName(value.getType());
            //jgen.writeStringField(value.getType(), value.getType());
            // jgen.writeStartObject();
            //jgen.writeObject(value);
            //jgen.writeStartObject("XMY");
            //jgen.writeStringField("value", value.getName());
            // jgen.writeEndObject();
            jgen.writeEndObject();
        }

    }
}
所需的输出如下:

{
-preferences : [
-{
    -children : [
    -{
        children : null
        type : "A1"
        ColumnId : "86"
    }
    -{
        children : null
        type : "A2"
        ColumnId : "87"
    }
    -{
        children : null
        type : "A1"
        ColumnId : "382"
        Selected : "true"
    }
}
如果我能得到它就更好了:

{
-preferences : [
-{
    -A1 : [
    -{
        children : null
        type : "A1"
        ColumnId : "86"
    }
    -A2{
        children : null
        ColumnId : "87"
    }
    -A3{
        children : null
        ColumnId : "382"
        Selected : "true"
    }
}
我尝试使用JsonSerialize,但它似乎无法与HashMap一起工作。任何指点都会有很大的帮助

问候
WhiteLotus

既然您想更改JSON输出的布局,我认为您应该在类级别更改序列化,这应该可以:

@JsonSerialize(using = SubjectAutocompleteSerializer.class)
public class PreferenceEntity {
    ...
        public static class SubjectAutocompleteSerializer extends JsonSerializer<PreferenceEntity> {

            public void serialize(PreferenceEntity value, JsonGenerator jgen,
                          SerializerProvider provider) throws IOException,
                JsonProcessingException {

                jgen.writeStartObject();
                if (value.name != null && !value.name.isEmpty()) {
                    jgen.writeStringField("name", value.name);
                }
                if (value.getType() != null && !value.getType().isEmpty()) {
                    jgen.writeStringField("type", value.getType());
                }
                for (Entry<String, String> entry : value.getAttributes().entrySet()) {
                    jgen.writeStringField(entry.getKey(), entry.getValue());
                }
                jgen.writeObjectField("children", value.getChildren());

                jgen.writeEndObject();
            }
    }
}
@JsonSerialize(使用=SubjectAutocompleteSerializer.class)
公共类优先实体{
...
公共静态类SubjectAutocompleteSerializer扩展了JsonSerializer{
public void序列化(PreferenceEntity值,JsonGenerator jgen,
SerializerProvider提供程序)引发IOException,
JsonProcessingException{
jgen.writeStartObject();
if(value.name!=null&&!value.name.isEmpty()){
jgen.writeStringField(“name”,value.name);
}
if(value.getType()!=null&&!value.getType().isEmpty()){
writeStringField(“type”,value.getType());
}
for(条目:value.getAttributes().entrySet()){
writeStringField(entry.getKey(),entry.getValue());
}
writeObject字段(“children”,value.getChildren());
jgen.writeEndObject();
}
}
}

这种方法在某种程度上有效。但问题是它没有序列化childern。如何序列化它们?您所说的“它不序列化子对象”是什么意思?你是说你发布的第三个输出块@whitelotus在serilize方法中,您已经演示了如何编写名称、类型和hashmap。但是把孩子列出来怎么样。我应该使用Jen.writeobject吗?@WhiteLotus我稍微编辑了SubjectAutocompleteSerializer的实现,它应该能够覆盖您的第二个输出。您发布的最后一个输出似乎不是有效的json对象,您能更正吗?
@JsonSerialize(using = SubjectAutocompleteSerializer.class)
public class PreferenceEntity {
    ...
        public static class SubjectAutocompleteSerializer extends JsonSerializer<PreferenceEntity> {

            public void serialize(PreferenceEntity value, JsonGenerator jgen,
                          SerializerProvider provider) throws IOException,
                JsonProcessingException {

                jgen.writeStartObject();
                if (value.name != null && !value.name.isEmpty()) {
                    jgen.writeStringField("name", value.name);
                }
                if (value.getType() != null && !value.getType().isEmpty()) {
                    jgen.writeStringField("type", value.getType());
                }
                for (Entry<String, String> entry : value.getAttributes().entrySet()) {
                    jgen.writeStringField(entry.getKey(), entry.getValue());
                }
                jgen.writeObjectField("children", value.getChildren());

                jgen.writeEndObject();
            }
    }
}