如何使用Jackson API从json更新现有的对象列表

时间:2016-05-04 16:26:04

标签: java json spring jackson

我有一个我想要更新的对象列表。 基本上我使用spring创建了我的对象,但对象的内容是空的。

我想使用Jackson解析器从json文件更新对象列表。

json文件与该对象兼容。这意味着我让映射器自动检测设置器。

映射器正在将对象加载到列表中 作为LinkedHashMap对象而不是我的对象

这是我的json

    [
    {
        "startDate":"01/06/2014 08:00",
        "endDate":"01/06/2014 16:00",
        "shiftType":"Regular",
        "capacity":5
    },
    {
        "startDate":"01/06/2014 16:00",
        "endDate":"01/06/2014 23:00",
        "shiftType":"Regular",
        "capacity":5
    },
    {
        "startDate":"01/06/2014 23:00",
        "endDate":"02/06/2014 08:00",
        "shiftType":"Regular",
        "capacity":5
    },
    {
        "startDate":"02/06/2014 08:00",
        "endDate":"02/06/2014 16:00",
        "shiftType":"Regular",
        "capacity":5
    },
]

这是我的对象

    package il.co.shiftsgenerator.engine.model;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class ShiftConfiguration {

    private int capacity;
    private String shiftType;
    private String startDate;
    private String endDate;
    private SimpleDateFormat dateFormat;
    public int getCapacity() {
        return capacity;
    }
    public String getStartDate() {
        return startDate;
    }
    public void setStartDate(String startDate) throws ParseException {
        dateFormat.parse(startDate);
        this.startDate = startDate;
    }
    public String getEndDate() {
        return endDate;
    }
    public void setEndDate(String endDate) throws ParseException {
        dateFormat.parse(endDate);
        this.endDate = endDate;
    }
    public void setCapacity(int capacity) {
        this.capacity = capacity;
    }
    public String getShiftType() {
        return shiftType;
    }
    public void setShiftType(String shiftType) {
        this.shiftType = shiftType;
    }
    public SimpleDateFormat getDateFormat() {
        return dateFormat;
    }
    public void setDateFormat(SimpleDateFormat dateFormat) {
        this.dateFormat = dateFormat;
    }
    @Override
    public String toString() {
        return "ShiftConfiguration [capacity=" + capacity + ", shiftType="
                + shiftType + ", startDate=" + startDate + ", endDate="
                + endDate + "]";
    }

}

这就是我尝试加载数据的方式

    ObjectMapper  mapper = new ObjectMapper();
InputStream stream =  fileLoaderHelper.getFileAsStream(SHIFT_CONFIG_LIST_JSON_FILE);
List<ShiftConfiguration> shiftBeans = new ArrayList<ShiftConfiguration>();      

for (int i = 0; i < 21; i++) {
    ShiftConfiguration shiftBean = context.getBean(ShiftConfiguration.class);
    shiftBeans.add(shiftBean);
}

ObjectReader readerForUpdating = mapper.readerForUpdating(shiftBeans);
readerForUpdating.readValues(stream);
System.out.println(shiftBeans);

2 个答案:

答案 0 :(得分:1)

由于您的日期格式,它可能无法检测到正确的对象。我会尝试明确告诉杰克逊你的约会时间的格式,也许这将把事情弄清楚。尝试像

这样的东西
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm");
mapper.setDateFormat(df);

在mapper.readerForUpdating调用之前,看看是否这样做。

答案 1 :(得分:0)

这是因为您没有指定要使用的实际类型:您正在阅读List的{​​{1}},但您没有指定类型。杰克逊不知道预期的类型是什么:你只是将一个对象交给更新,由于Java Type Erasure,ShiftConfiguration没有运行时泛型类型信息。

因此,您需要创建List,然后创建方法以表明您要更新readerFor(new TypeRefererence<List<ShiftConfiguration>>() { })

或者,您可能只想阅读新列表,提供所需的类型信息,并使用List手动连接。