首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson2 Java数组在创建数组时忽略字段名

Jackson2 Java数组在创建数组时忽略字段名
EN

Stack Overflow用户
提问于 2014-04-28 14:43:27
回答 2查看 2.1K关注 0票数 2

我正在尝试创建一个Java端点,它返回一个JSON数据数组,以供JQuery标记插件使用。

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

代码语言:javascript
复制
[ [x1, y1], [x2, y2], ... ]

假设我在Java中有一个Point对象列表,即

代码语言:javascript
复制
List<Point> data = new ArrayList<>();

其中Point被定义为

代码语言:javascript
复制
public class Point {

    private final Integer x;
    private final Integer y;

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

    ...
 }

如果有的话,我需要在Jackson2对象上添加哪些方法或注释才能获得正确的JSON格式。目前,我正在以这种格式获得输出:

代码语言:javascript
复制
[{x:x1, y:y1}, {x:x2, y:y2} ...]

当我需要这种格式时:

代码语言:javascript
复制
[[x1,y1], [x2,y2] ...]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-28 16:15:00

您可以编写自定义Point序列化程序。

代码语言:javascript
复制
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类。

代码语言:javascript
复制
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;
    }
}

试试看

代码语言:javascript
复制
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));

代码产生以下结果

代码语言:javascript
复制
[[1,2],[2,3]]

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-04-28 15:49:56

您可以在一个特殊的getter方法上使用@JsonView注释,该方法返回一个intergers数组。下面是一个示例:

代码语言:javascript
复制
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)));
    }

}

输出:

代码语言:javascript
复制
[ 12, 45 ]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23344099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档