Jackson2 Java到Json数组在创建数组时忽略字段名称

Posted

技术标签:

【中文标题】Jackson2 Java到Json数组在创建数组时忽略字段名称【英文标题】:Jackson2 Java to Json array ignore field names when creating array 【发布时间】:2014-06-14 04:15:13 【问题描述】:

我正在尝试创建一个 Java REST 端点,该端点返回一个 JSON 数据数组,供 JQuery FLOT 图表插件使用。

至少,FLOT 的 JSON 数据需要是一个数字数组,即

[ [x1, y1], [x2, y2], ... ]

鉴于我在 Java 中有一个 Point 对象列表,即

List<Point> data = new ArrayList<>();

其中Point定义为

public class Point 

    private final Integer x;
    private final Integer y;

    public Point(Integer x, Integer y) 
        this.x = x;
        this.y = y;
    

    ...
 

我需要在 Java 对象上放置什么方法或 Jackson2 注释(如果有)以获得正确的 JSON 格式。目前我得到这种格式的输出:

[x:x1, y:y1, x:x2, y:y2 ...]

当我需要这种格式时:

[[x1,y1], [x2,y2] ...]

【问题讨论】:

你需要的不是一个有效的 json.. 我只是概述了格式之间的差异,而不是完整的语法:) @mserioli 最终的 Flot 格式是有效的 JSON...数组数组...诀窍是 Ayub 需要自定义 Jackson“对象映射器/解析器”将 x,y 作为数组返回. 作为地图。 (我不确定这个映射器/解析器的 Jackson 术语是什么) 好的我明白了:) 【参考方案1】:

您可以在返回整数数组的特殊 getter 方法上使用 @JsonView 注释。这是一个例子:

public class JacksonObjectAsArray 
    static class Point 

        private final Integer x;
        private final Integer y;

        public Point(Integer x, Integer y) 
            this.x = x;
            this.y = y;
        

        @JsonValue
        public int[] getXY() 
            return new int[] x, y;
        
    

    public static void main(String[] args) throws JsonProcessingException 
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Point(12, 45)));
    


输出:

[ 12, 45 ]

【讨论】:

JsonValue,如示例中所写,不是答案顶部的JsonView【参考方案2】:

你可以写一个自定义的Point序列化器

import java.io.IOException;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

public class CustomPointSerializer extends JsonSerializer<Point> 

    @Override
    public void serialize(Point point, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException 
        gen.writeStartArray();
        gen.writeNumber(point.getX());
        gen.writeNumber(point.getY());
        gen.writeEndArray();
    

然后您可以将自定义序列化程序类设置为您的 Point

import org.codehaus.jackson.map.annotate.JsonSerialize;

@JsonSerialize(using = CustomPointSerializer.class)
public class Point 

    private Integer x;
    private Integer y;

    public Point(Integer x, Integer y) 
        this.x = x;
        this.y = y;
    

    public Integer getX() 
        return x;
    

    public void setX(Integer x) 
        this.x = x;
    

    public Integer getY() 
        return y;
    

    public void setY(Integer y) 
        this.y = y;
    

试试看

ObjectMapper mapper = new ObjectMapper();
List<Point> points = new ArrayList<Point>();
points.add(new Point(1,2));
points.add(new Point(2,3));
System.out.println(mapper.writeValueAsString(points));

代码产生以下结果

[[1,2],[2,3]]

希望这会有所帮助。

【讨论】:

我使用了这个答案的稍微修改过的版本,但是它有帮助 我很高兴能帮上忙,问候。

以上是关于Jackson2 Java到Json数组在创建数组时忽略字段名称的主要内容,如果未能解决你的问题,请参考以下文章

java中把json怎么转换成数组?

java中把json怎么转换成数组

jackson2.8.4java对象序列化成json字符串格式化时间

如何将 SQL 数据映射到 Java JSON 对象和 JSON 数组?

如何让 webflux 端点用每个项目的对象名称序列化 json

json数组转java对象怎么转