代码之家  ›  专栏  ›  技术社区  ›  DVK

可以为标准类定制jackson序列化程序吗?(例如list<list<string>>)

  •  0
  • DVK  · 技术社区  · 6 年前

    我正在尝试为类A的实例变量创建自定义序列化程序。

    问题是变量是一个内置的“标准”类型( List<List<String>> )

    我发现理论上可以为 used ONLY within your class using mix-ins ;所以理论上,如果我可以为 列表<列表<字符串>> ,我可以那样混进A班。

    但是如何为 列表<列表<字符串>> ?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Danila Zharenkov    6 年前

    我想可能是这样的。我不知道序列化时要使用的逻辑,所以我编写了简单的json数组[][]

    private static class ListListSerializer extends StdSerializer<List<List<String>>>{
        protected ListListSerializer(Class<List<List<String>>> t) {
            super(t);
        }
        protected ListListSerializer(){
            this(null);
        }
    
    
        @Override
        public void serialize(List<List<String>> lists, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeStartArray();
            for (List<String> strings : lists) {
                jsonGenerator.writeStartArray();
                for (String string : strings) {
                    jsonGenerator.writeString(string);
                }
                jsonGenerator.writeEndArray();
            }
            jsonGenerator.writeEndArray();
        }
    }
    

    例如不含mixin

    private static class YourObject {
    
         private List<List<String>> myStrings = new ArrayList<>();
    
        public YourObject() {
            List<String> a = Arrays.asList("a","b","c");
            List<String> b = Arrays.asList("d","f","g");
            myStrings.add(a);
            myStrings.add(b);
    }
    
        @JsonSerialize(using = ListListSerializer.class)
        public Object getMyStrings(){
           return myStrings;
        }
    }
    
    
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(new YourObject()));
    }
    

    输出是

    {"myStrings":[["a","b","c"],["d","f","g"]]}
    

    这就是你想做的吗?