对于给定的文件夹路径,我想在一个地图中加载/转换该文件夹中的所有JSON文件。
InputStream input = new ClassPathResource(jsonFile).getInputStream();
jsonMap = new ObjectMapper().readValue(input,
new TypeReference<Map<String, MappedContacts>>() {});
我已经设法为单个文件执行此操作,但我不确定如何有效地为多个文件执行此操作。
答案 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);
}