将包含对的JSON数组转换为点列表

我有以下JSON:

{
  "points": [88,223,88,91,223]
}

,我需要使用Jackson将其映射到以下课程:

public MyClass {
    public List<Point2D.Float> points;
}

我该怎么做?

ZENGMINGMIN2009 回答:将包含对的JSON数组转换为点列表

首先,使用您选择的JSON解析器解析JSON(显然是杰克逊)。

其次,一次迭代列表/数组,一次迭代2个值,例如

public static List<Point2D.Float> toPoints(List<Float> coords) {
    List<Point2D.Float> points = new ArrayList<>();
    for (Iterator<Float> iter = coords.iterator(); iter.hasNext(); )
        points.add(new Point2D.Float(iter.next(),iter.next()));
    return points;
}

测试

System.out.println(toPoints(List.of(88f,223f,88f,91f,223f)));

输出

[Point2D.Float[88.0,223.0],Point2D.Float[88.0,Point2D.Float[91.0,223.0]]
,

Jackson集成的方法是为JsonDeserializer元素列表实现并注册自定义Point2D.Float

例如,实现一个JsonDeserializer以将"points" JSON数组解析为float[],然后从该数组中获取对并从中创建Point2D.Float对象。将它们添加到List<Point2D.Float>中并返回。

可能看起来像

class PointsDeser extends JsonDeserializer<List<Point2D.Float>> {
    @Override
    public List<Point2D.Float> deserialize(JsonParser p,DeserializationContext ctxt)
            throws IOException,JsonProcessingException {
        float[] coords = ctxt.readValue(p,float[].class);
        if (coords.length % 2 != 0) {
            throw new JsonParseException("Expected an even number of values.");
        }
        List<Point2D.Float> points = new ArrayList<>(coords.length / 2);
        for (int i = 0; i < coords.length; i += 2) {
            points.add(new Point2D.Float(coords[i],coords[i + 1]));
        }
        return points;
    }
}

然后用@JsonDeserialize注释属性,指向正确的反序列化器类

@JsonDeserialize(using = PointsDeser.class)
public void setPoints(List<Point2D.Float> points) {
    this.points = points;
}

并像往常一样使用杰克逊

ObjectMapper mapper = new ObjectMapper();
MyClass instance = mapper.readValue(json,MyClass.class);

如果您无法直接注释MyClass,请使用mixin

本文链接:https://www.f2er.com/3108769.html

大家都在问