Array Serialize使用Jackson

时间:2015-09-17 07:12:57

标签: java arrays json serialization jackson

我正在使用JSON序列化。这是我的代码。 我需要使用Annotation更改限定类名。我不必使用Map或其他课程。应从注释中选择名称。

package com.test;

import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;


@JsonTypeName("Product")
@JsonRootName("Product")
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type")
public class ProductDTO {
    private String name;
    private String description;

    public String getName() {
        return name;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

测试类: -

package com.test;

import java.io.IOException;
import java.util.ArrayList;

import org.junit.Test;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class ProductDTOTestCase {
    @Test
    public void testPersistAndFindById() throws JsonGenerationException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();

        mapper.enableDefaultTyping();
        //mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.WRAPPER_ARRAY);

        ProductDTO productDTO = new ProductDTO();
        productDTO.setDescription("Product 4 - Test");

        ArrayList<ProductDTO> arrayList = new ArrayList<ProductDTO>();
        arrayList.add(productDTO);

        // Do not change this line
        String writeValueAsString = mapper.writeValueAsString(arrayList);
        System.out.println(writeValueAsString);
//      /Assert.assertTrue(writeValueAsString.contentEquals("Entity"));
    }


}

它给了我: -

 [["com.test.ProductDTO",{"name":null,"description":"Product 4 - Test"}]]

但我想要

[["Product",{"name":null,"description":"Product 4 - Test"}]]

1 个答案:

答案 0 :(得分:0)

问题是您基本上序列化了一个通用的ArrayList(您的ArrayList的类,因为没有可用的通用信息)。

因此,我们的基本List.class根本没有@JsonTypeInfo注释或所包含的项目,没有可用的类型信息,这就是为什么你得到你的类的简单名称。

解决方案:

  • 使用自定义子类,如&#34;类MyList extends ArrayList {}&#34; - &GT;它不会遭受这种类型的擦除(通用类型信息被隐藏,但保留)并且将按预期工作,或者
  • 使用ObjectWriter并在序列化中指定完整的泛型类型:mapper.writerForType(listType).writeValueAsString()(可以使用TypeFactory或使用TypeReference构造的listType)