Java JsonSerialize与HashMap
我有以下java代码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;
@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();
}
}
}