将文件夹中的多个JSON文件读入地图

时间:2018-04-06 10:44:23

标签: java stream jackson inputstream objectmapper

对于给定的文件夹路径,我想在一个地图中加载/转换该文件夹中的所有JSON文件。

InputStream input = new ClassPathResource(jsonFile).getInputStream();
jsonMap = new ObjectMapper().readValue(input,
    new TypeReference<Map<String, MappedContacts>>() {});

我已经设法为单个文件执行此操作,但我不确定如何有效地为多个文件执行此操作。

2 个答案:

答案 0 :(得分:0)

您可以使用@JsonMerge注释告诉jackson您的属性值应使用“合并”方法。

...首先访问当前值(使用getter或field),然后进行修改 是否有传入数据:如果没有,则在不考虑当前状态的情况下进行分配

让我们看看例子, 假设您有2个(或更多)json文件:

contacts1.json

{
  "person1": {
    "contacts": [1,2]
  },
  "person2": {
    "contacts": []
  }
}

和contacts2.json

{
  "person1": {
    "contacts": [3,4]
  },
  "person2": {
    "contacts": [100]
  }
}

和您的MappedContacts

class MappedContacts {
        @JsonMerge
        List<Integer> contacts;

        public List<Integer> getContacts() {
            return contacts;
        }

        public void setContacts(List<Integer> contacts) {
            this.contacts = contacts;
        }

        @Override
        public String toString() {
            return contacts.toString();
        }
    }

然后测试它是否有效,只需简单的hello jackson合并:

public static void main(String[] args) throws IOException {
    TypeReference<Map<String, MappedContacts>> type = new TypeReference<Map<String, MappedContacts>>() {};
    InputStream input = new ClassPathResource("contacts1.json").getInputStream();
    InputStream input2 = new ClassPathResource("contacts2.json").getInputStream();
    ObjectMapper mapper = new ObjectMapper();
    Object contacts = mapper.readValue(input, type);
    mapper.readerFor(type)
            .withValueToUpdate(contacts)
            .readValues(input2);

        System.out.println(contacts);
    }

输出

{a=[1, 2, 3, 4], b=[100]}

答案 1 :(得分:0)

由于我使用Spring,因此在使用ObjectMapper将每个资源转换为地图之前,使用PathMatchingResourcePatternResolver从文件夹中检索所有资源非常容易:

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(ConfigMapping.class.getClassLoader());

Resource[] resources = resolver.getResources("classpath*:/META-INF/resources/mapper/*");

for (Resource resource: resources) {
 InputStream input = resource.getInputStream();
 Map < String, MappedContacts> jsonMap = new ObjectMapper().readValue(input, new TypeReference < Map < String, MappedContacts>> () {});
 mapping.putAll(jsonMap);
}