java - 从 JSON 文件读取

标签 java json jackson

我有一个 Movie 类,我必须以 JSON 文件的形式在目录 Database\Movies.JSON 上存储数据库 电影类有一个方法供管理员向数据库添加新的电影列表。

问题是,当创建第一部电影时,JSON 不是 movies 对象的数组。当我尝试添加后续电影时,我需要从中读取并将其创建为电影对象数组。 Jackson JSON API 有没有一种巧妙的方法来做到这一点?

我使用的是最新的 Jackson 2.6.3

public void createMovie() {
    ObjectMapper objectMapper = new ObjectMapper();
    File f = new File("./Database/Movies.json");
    if (f.exists() && !f.isDirectory()) { // if existing data exist, read
                                            // from it and append new movie
                                            // data
    } else {
        try {
            objectMapper.writeValue(new FileOutputStream(f), this);
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此后我将其创建为电影对象数组。

objectMapper.writeValue(new FileOutputStream(f), Collections.singleton(this));

但是当我尝试使用下面的代码来处理现有数据时,它在第一行崩溃

List<Movie> myMovies = objectMapper.readValue(f,objectMapper.getTypeFactory().constructCollectionType(List.class, Movie.class));
myMovies.add(this);
objectMapper.writeValue(new FileOutputStream(f), myMovies);

错误跟踪

at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:857)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:62)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:258)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2658)
    at entity.Movie.createMovie(Movie.java:167)

示例 JSON 数据

   [
    {
        "movieID": 0,
        "title": "213131 13213 axda",
        "type": "DIGITAL",
        "synopsis": null,
        "director": null,
        "casts": [],
        "status": "COMING_SOON",
        "showTimes": null,
        "cinema": null,
        "mRating": "G",
        "rRating": "_0",
        "reviews": [],
        "totalSales": 0
    }
]

最佳答案

为了避免处理此数组/非数组问题,您应该始终在文件中存储 json 数组。您可以将您的第一部电影添加为包含此单个元素的数组。你可以这样做:

objectMapper.writeValue(new FileOutputStream(f), Collections.singleton(this));

关于java - 从 JSON 文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33435238/

相关文章:

spring-boot - Spring Boot Jackson - 日志记录

java - 如何使用 Jackson 从 Json 文件中读取特定对象

java - JSON 中新日期对象的正则表达式

java - 以编程方式刷新/重新启动当前 Tomcat 实例

javascript - 从 json 中删除项目,再次点击

node.js - 使用 Vue 处理来自 Express API 的错误

java - AlarmManager setInexactRepeating、setWindow、setRepeating 方法在一周内从循环内调用时不会触发警报

java - 如何在java中向特定客户端发送响应?

javascript - 如何使用 jSignature.js 在一个页面中显示多个签名?

java - SpringBoot 使用 Jackson 在 Java 中反序列化 JSON 数组