ObjectMapper追加文件JSON

时间:2015-03-12 19:03:52

标签: java json file io jackson

试图了解一些杰克逊,所以我写了一个简单的程序,它读取文件/创建一个文件来存储一些JSON。在Jackson网站上,我想出了如何从文件中读取和写入,但在我的基本程序中,我也想要追加。我基本上试图存储购物清单列表。有一个购物清单对象,其中包含商店名称,该商店的amd商品。

麻烦的是我无法找到将另一个条目追加到文件末尾的方法(采用JSON格式)。这是我到目前为止所使用的,您可以忽略它只是一个愚蠢的控制台扫描程序要求输入:

    public class JacksonExample {

    static ObjectMapper mapper = new ObjectMapper();
    static File file = new File("C:/Users/stephen.protzman/Desktop/user.json");
    static List<ShoppingList> master = new ArrayList<ShoppingList>();

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        boolean running = true;
        while (running) {
            System.out.println("[ 1 ] Add a new shopping list");
            System.out.println("[ 2 ] View all shopping lists");
            System.out.println("[ 3 ] Save all shopping lists");
            int choice = Integer.parseInt(in.nextLine());
            switch (choice) {
            case 1:
                getNewList();
            case 2:
                display();
            case 3:
                running = false;
            }
        }
        in.close();
    }

    public static void getNewList() {
        boolean more = true;
        String store, temp;
        List<String> items = new ArrayList<String>();
        Scanner s = new Scanner(System.in);
        System.out.println("Enter the store: ");
        store = s.nextLine();
        System.out.println("Enter each item [If done type 'DONE'] :");
        while (more) {

            temp = s.nextLine();
            if (temp != null) {
                if (temp.toUpperCase().equals("DONE")) {
                    more = false;
                } else {
                    items.add(temp);
                }
            }

        }
        save(store, items);
        s.close();

    }

    public static void display() {
        try {
            ShoppingList list = mapper.readValue(file, ShoppingList.class);
            System.out.println(mapper.defaultPrettyPrintingWriter()
                    .writeValueAsString(list));

        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void save(String store, List<String> items) {
        //load in old one
        try {
            ShoppingList list = mapper.readValue(file, ShoppingList.class);
            System.out.println(mapper.defaultPrettyPrintingWriter()
                    .writeValueAsString(list));

        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //add to end of older list
        ShoppingList tempList = new ShoppingList();
        tempList.setStore(store);
        tempList.setItems(items);

        master.add(tempList);

        try {

            mapper.writeValue(file, master);


        } catch (JsonGenerationException e) {

            e.printStackTrace();

        } catch (JsonMappingException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }
    }

}

我想继续使用ObjectMapper(考虑到我试图学习杰克逊)我还没有找到一种方法来追加即可。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

要附加内容,您需要使用Streaming API来创建JsonGenerator;然后你可以给这个生成器ObjectMapper写入。如下所示:

JsonGenerator g = mapper.getFactory().createGenerator(outputStream);
mapper.writeValue(g, valueToWrite);
// and more
g.close();

答案 1 :(得分:3)

下面的方法可用于在追加模式下将对象写入json文件。它首先读取您现有的json文件,并将新的Java对象添加到JSON文件中。

    public static void appendWriteToJson() {

    ObjectMapper mapper = new ObjectMapper();

    try {
        // Object to JSON in file
        JsonDaoImpl js = new JsonDaoImpl();
        URL resourceUrl = js.getClass().getResource("/data/actionbean.json");
        System.out.println(resourceUrl);
        File file = new File(resourceUrl.toURI());

        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file, true))); // append mode file writer

        mapper.writeValue(out, DummyBeanObject);

    } catch (Exception e) {
        e.printStackTrace();
    }
}