当前位置: 首页 > 知识库问答 >
问题:

Spring&Jackson-JSON列表自定义XML

祁英哲
2023-03-14
{
    "name": "Edward",
    "address": [
        {
            "streetName": "value1",
            "city": "value2"
        },
        {
            "streetName": "value3",
            "city": "value4"
        }
    ]
}
<root>
    <name>Edward</name>
    <streetName1>value1</streetName1>
    <city1>value2</city1>
    <streetName2>value3</streetName2>
    <city2>value4</city2>
</root>
@JacksonXmlElementWrapper(useWrapping = false)
private List<Address> address = new ArrayList<>();
<root>
    <name>Edward</name>
    <address>
        <streetName>value1</streetName>
        <city>value2</city>
    </address>
    <address>
        <streetName>value3</streetName>
        <city>value4</city>
    </address>
</root>

共有1个答案

顾俊誉
2023-03-14

使用自定义序列化程序可以解决您的问题,因此,如果您有一个Person类,如下所示:

@JacksonXmlRootElement(localName = "root")
@JsonSerialize(using = PersonSerializer.class)
public class Person {

    private String name;

    private List<Address> address = new ArrayList<>();

}

您可以构建一个自定义的PersonSerializerserializer类,扩展JSONSerializer类,如下所示:

public class PersonSerializer extends JsonSerializer<Person> {

    @Override
    public void serialize(Person t, JsonGenerator jg, SerializerProvider sp) throws IOException {
        String streetName = "streetName";
        String city = "city";
        int nStreet = 1;
        int nCity = 1;
        jg.writeStartObject();
        jg.writeStringField("name", t.getName());
        for (Address address : t.getAddress()) {

            jg.writeStringField(streetName + String.valueOf(nStreet++), address.getStreetName());
            jg.writeStringField(city + String.valueOf(nCity++), address.getCity());

        }
        jg.writeEndObject();
    }

}

然后,您可以像下面这样序列化Person对象,获得预期的xml结果:

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
//you already have your person object to serialize
String result = xmlMapper.writeValueAsString(person);
 类似资料:
  • 问题内容: 我正在使用Flickr API 。调用该方法时,默认的JSON结果为: 我想将此响应解析为Java对象: JSON属性应按以下方式映射: 不幸的是,我无法找到一种使用Annotations做到这一点的好方法。到目前为止,我的方法是将JSON字符串读入a 并从中获取值。 但是我认为,这是有史以来最不优雅的方式。有没有简单的方法,可以使用注释还是自定义反序列化器? 这对我来说将是很明显的,

  • 有没有一种方法可以使用Jackson JSON处理器来执行自定义字段级别的序列化?例如,我想让 注意,age=25被编码为数字,而favoritenumber=123被编码为字符串。Jackson将编组为一个数字。在这种情况下,我希望将favoriteNumber编码为字符串。

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 问题内容: 有没有一种使用Jackson JSON Processor进行自定义字段级序列化的方法?例如,我想上课 序列化为以下JSON: 请注意,age = 25被编码为 数字, 而favoriteNumber = 123被编码为 string 。开箱即用的杰克逊将集结到一个号码。在这种情况下,我希望将favoriteNumber编码为字符串。 问题答案: 您可以实现自定义序列化器,如下所示:

  • 我试图用Jackson库创建复杂类的对象。每个对象都有一个模式,反序列化器需要使用该模式来解释JSON。我的问题是如何向反序列化器提供模式? 反序列化程序扩展了类JSONDeserializer,该类具有无参数构造函数和必须重写的抽象方法反序列化(解析器、上下文)。我想改用另一种方法反序列化(解析器、上下文、值),其中值是部分构造的对象,其中包括模式。也就是说,反序列化方法可以调用value。sc

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?