Java 如何忽略变量名而序列化值-jackson fasterxml
我从代码中获得以下输出: {“列表”:[{“x”:“y”},{“a”:“b”}]} 相反,我希望得到如下输出: [{“x”:“y”},{“a”:“b”}] 代码如下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("
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 serializet.list
”方法是最明显的方法。我不想重做响应,特别是因为它是固定的,而且响应可能很大。我希望序列化能够解决这个问题,所以这只是一次。还根据您的建议编辑了问题。