【问题标题】:How to ignore variable name but serialize value - jackson fasterxml如何忽略变量名但序列化值 - jackson fasterxml
【发布时间】:2016-01-09 07:43:30
【问题描述】:

我从代码中得到以下输出: {"list":[{"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());
  }
 }

更新此问题 - 使其更上一层楼 给我:

{"list":[{"map":{"x":"y","x1":"y1"}},{"map":{"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());
}
 }

【问题讨论】:

  • 你为什么不直接打电话给objectMapper.writeValue(writer, t.list)
  • 说我有 List 并且 Car 有一张地图——然后呢?如何忽略地图但只打印 [ {"x","y"},{...}] 之类的名称值?
  • 最简单的解决方法是从 List&lt;Car&gt; 创建一个 List&lt;Map&lt;...&gt;&gt;。不过,可能有一种方法可以将 Jackson 配置为自动为您执行此操作 - 您应该将该示例添加到您的问题中,作为您想要执行的操作的示例,否则“仅序列化 t.list”方法是最明显的一种。
  • 我不想重做响应,尤其是因为它是固定的并且它们可能很大。我希望序列化处理这个问题,所以这是一次。还根据您的建议编辑了问题。

标签: java jackson fasterxml


【解决方案1】:

您可能想使用 @JsonValue 注释,其文档说:

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

【讨论】:

    【解决方案2】:

    我实现了 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 我不允许在 Map 上有一个 getter 并且 JsonValue 不适用于非公共字段。 (或者我无法让它工作)

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2013-04-11
      • 2016-03-21
      • 2013-09-16
      • 2023-04-02
      • 2015-01-12
      • 2023-04-11
      • 2012-02-02
      • 2012-02-01
      相关资源
      最近更新 更多