我有以下JSON:
{
"points": [88,223,88,91,223]
}
,我需要使用Jackson
将其映射到以下课程:
public MyClass {
public List<Point2D.Float> points;
}
我该怎么做?
我有以下JSON:
{
"points": [88,223,88,91,223]
}
,我需要使用Jackson
将其映射到以下课程:
public MyClass {
public List<Point2D.Float> points;
}
我该怎么做?
首先,使用您选择的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。