Java 如何忽略变量名而序列化值-jackson fasterxml

Java 如何忽略变量名而序列化值-jackson fasterxml,java,jackson,fasterxml,Java,Jackson,Fasterxml,我从代码中获得以下输出: {“列表”:[{“x”:“y”},{“a”:“b”}]} 相反,我希望得到如下输出: [{“x”:“y”},{“a”:“b”}] 代码如下 public class Test { List<Map> list = new ArrayList(); public static void main(String [] args){ Test t = new Test(); Map m1 = new HashMap(); m1.put("

我从代码中获得以下输出: {“列表”:[{“x”:“y”},{“a”:“b”}]}

相反,我希望得到如下输出: [{“x”:“y”},{“a”:“b”}]

代码如下

public class Test {
List<Map> list = new ArrayList();
public static void main(String [] args){
    Test t = new Test();

    Map m1 = new HashMap();
    m1.put("x","y");
    t.list.add(m1);

    Map m2 = new HashMap();
    m2.put("a","b");
    t.list.add(m2);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);
    objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE);
    Writer writer = new StringWriter();
    try {
        objectMapper.writeValue(writer, t);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    System.out.println("The json is:\n"+writer.toString());
  }
 }
公共类测试{
列表=新的ArrayList();
公共静态void main(字符串[]args){
测试t=新测试();
Map m1=新的HashMap();
m1.投入(“x”、“y”);
t、 增加(m1);
Map m2=新的HashMap();
m2.出售(“a”、“b”);
t、 列表。添加(m2);
ObjectMapper ObjectMapper=新的ObjectMapper();
objectMapper.setSerializationInclusion(Include.NON_EMPTY);
objectMapper.setVisibility(PropertyAccessor.FIELD,Visibility.NON_PRIVATE);
Writer-Writer=新的StringWriter();
试一试{
objectMapper.writeValue(writer,t);
}捕获(例外e){
抛出新的运行时异常(e);
}
System.out.println(“json是:\n”+writer.toString());
}
}
更新此问题-将其提高一个级别 给我:

{“列表”:[{“地图”:{“x”:“y”,“x1”:“y1”},{“地图”:{“a1”:“b1”,“a”:“b”}]}

我想要[{“x”:“y”,“x1”:“y1”},{“a1”:“b1”,“a”:“b”}]

 public class Test {
public class Car{
    Map map = new HashMap();
}
List<Car> list = new ArrayList();
public static void main(String [] args){
    Test t = new Test();

    Test.Car car = t.new Car();
    Map m1 = new HashMap();
    m1.put("x","y");
    m1.put("x1","y1");
    car.map = m1;
    t.list.add(car);

    car = t.new Car();
    Map m2 = new HashMap();
    m2.put("a","b");
    m2.put("a1","b1");
    car.map = m2;
    t.list.add(car);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);
    objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE);
    Writer writer = new StringWriter();
    try {
        objectMapper.writeValue(writer, t);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    System.out.println("The json is:\n"+writer.toString());
}
 }
公共类测试{
公车{
Map Map=newhashmap();
}
列表=新的ArrayList();
公共静态void main(字符串[]args){
测试t=新测试();
试验车=t.新车();
Map m1=新的HashMap();
m1.投入(“x”、“y”);
m1.put(“x1”、“y1”);
car.map=m1;
t、 列表。添加(car);
car=t.新车();
Map m2=新的HashMap();
m2.出售(“a”、“b”);
m2.put(“a1”、“b1”);
car.map=m2;
t、 列表。添加(car);
ObjectMapper ObjectMapper=新的ObjectMapper();
objectMapper.setSerializationInclusion(Include.NON_EMPTY);
objectMapper.setVisibility(PropertyAccessor.FIELD,Visibility.NON_PRIVATE);
Writer-Writer=新的StringWriter();
试一试{
objectMapper.writeValue(writer,t);
}捕获(例外e){
抛出新的运行时异常(e);
}
System.out.println(“json是:\n”+writer.toString());
}
}

您可能希望使用
@JsonValue
注释,其文档说明:

标记注释类似于XmlValue,它指示带注释的“getter”方法的结果(这意味着签名必须是getter的结果;非void返回类型,无args)将用作实例序列化的单个值。值通常是简单的标量类型(字符串或数字),但它可以是任何可序列化类型(集合、映射或Bean)

下面是一个工作示例:

public class Test {
    public static class Car {
        Map map = new HashMap();

        @JsonValue
        public Map getMap() {
            return map;
        }
    }

    List<Car> list = new ArrayList();

    @JsonValue
    public List<Car> getList() {
        return list;
    }

    public static void main(String[] args) throws IOException {
        Test t = new Test();

        Car car = new Car();
        Map m1 = new HashMap();
        m1.put("x", "y");
        m1.put("x1", "y1");
        car.map = m1;
        t.list.add(car);

        car = new Car();
        Map m2 = new HashMap();
        m2.put("a", "b");
        m2.put("a1", "b1");
        car.map = m2;
        t.list.add(car);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
        Writer writer = new StringWriter();

        objectMapper.writeValue(writer, t);
        System.out.println("The json is:\n" + writer.toString());
    }
}
公共类测试{
公共静态级轿车{
Map Map=newhashmap();
@JsonValue
公共地图getMap(){
返回图;
}
}
列表=新的ArrayList();
@JsonValue
公共列表getList(){
退货清单;
}
公共静态void main(字符串[]args)引发IOException{
测试t=新测试();
汽车=新车();
Map m1=新的HashMap();
m1.投入(“x”、“y”);
m1.put(“x1”、“y1”);
car.map=m1;
t、 列表。添加(car);
汽车=新车();
Map m2=新的HashMap();
m2.出售(“a”、“b”);
m2.put(“a1”、“b1”);
car.map=m2;
t、 列表。添加(car);
ObjectMapper ObjectMapper=新的ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
Writer-Writer=新的StringWriter();
objectMapper.writeValue(writer,t);
System.out.println(“json是:\n”+writer.toString());
}
}

我实现了import com.fasterxml.jackson.databind.JsonSerializable;上了汽车课,并做了以下工作

  public class Car implements JsonSerializable{
  Map map = new HashMap();
  @Override
    public void serialize(JsonGenerator arg0, SerializerProvider arg1)
        throws IOException, JsonProcessingException {
        arg0.writeObject(map);
    }
  }

这删除了map关键字。我不能像上面那样使用JsonValue,因为在我的代码库中,我不允许在映射上使用getter,并且JsonValue不适用于非公共字段。(或者我无法让它工作)

你为什么不直接调用
objectMapper.writeValue(writer,t.list)
?假设我有列表,汽车有地图-然后呢?如何忽略映射而只打印像[{“x”,“y”},{…}]这样的名称值?最简单的解决方法是从该
列表创建
列表。不过,可能有一种方法可以配置Jackson自动为您执行此操作-您应该将该示例添加到您的问题中,作为您想要执行的操作的示例,否则“just serialize
t.list
”方法是最明显的方法。我不想重做响应,特别是因为它是固定的,而且响应可能很大。我希望序列化能够解决这个问题,所以这只是一次。还根据您的建议编辑了问题。