这里传进来的数据是set(用于arraylist去重)
代码
public class JsonFile {
private static final Logger log = LoggerFactory.getLogger(JsonFile.class);
static void output(Set<Artifact> set) {
String folderPath = "json";
String jsonFileName = "updatedArtifacts.json";
try {
Path path = Paths.get(folderPath);
if (!Files.exists(path)) {
Files.createDirectories(path);
}
} catch (Exception e) {
log.error("寻找json文件夹失败", e);
}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
File jsonFile = new File(folderPath + File.separator + jsonFileName);
try {
// 下载时只会下载set里面的数据,缓存中别的数据不会被下载
objectMapper.writeValue(jsonFile, set);
System.out.println("JSON 文件已成功导出到:" + jsonFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
log.error("导出json文件失败", e);
}
}
}
注意:Artifact对象一定要有getset方法,虽然看着没有使用,但是ObjectMapper封装里是有用到的
相关知识点
文件夹若不存在则创建
将字符串拼接成路径
// 运行结果:a\b\c.gz
Path path = Paths.get("a", "b", "c.gz");
try {
Path path = Paths.get(folderPath);
if (!Files.exists(path)) {
Files.createDirectories(path);
}
} catch (Exception e) {
log.error("寻找json文件夹失败", e);
}
复制、移动、删除文件
Path path1 = Paths.get("a.txt");
Path path2 = Paths.get("b.txt");
Path copy = Files.copy(path1, path2);
Path move = Files.move(path1, path2);
Files.deleteIfExists(path1);
ObjectMapper
ObjectMapper是Jackson的主要类,它可以帮助我们快速的进行各个类型和Json类型的相互转换。
json字符串与对象互转
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Hyl\", \"age\":20}";
//将字符串转换为对象
Student student = mapper.readValue(jsonString, Student.class);
//将对象转换为json字符串
jsonString = mapper.writeValueAsString(student);
数组和对象之间互转
//对象转为byte数组
byte[] byteArr = mapper.writeValueAsBytes(student);
//byte数组转为对象
Student student= mapper.readValue(byteArr, Student.class);
集合和json字符串之间互转
List<Student> studentList= new ArrayList<>();
// 集合转字符串
String jsonStr = mapper.writeValueAsString(studentList);
System.out.println(jsonStr);
List<Student> studentList2 = mapper.readValue(jsonStr, List.class);
System.out.println("字符串转集合:" + studentList2 );
map和json字符串之间转换
Map<String, Object> testMap = new HashMap<>();
// 集合转json
String jsonStr = mapper.writeValueAsString(testMap);
// json转集合
Map<String, Object> testMapDes = mapper.readValue(jsonStr, Map.class);
readTree()
此方法更灵活,可以只将用户感兴趣的Json串信息值提取出来。主要利用ObjectMapper提供的readTree和Jackson提供的JsonNode类来实现。
String test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
//此Json串比较复杂,包含了嵌套数组的形式,具有通用性。
//2.2.2.2实现反序列化
JsonNode node= objectMapper.readTree(test); // 将Json串以树状结构读入内存
JsonNode contents=node.get("results"); // 得到results这个节点下的信息
//遍历results下的信息,size()函数可以得节点所包含的的信息的个数,类似于数组的长度
for (int i = 0; i < contents.size(); i++) {
//读取节点下的某个子节点的值
System.out.println(contents.get(i).get("objectID").getIntValue());
JsonNode geoNumber=contents.get(i).get("geoPoints");
//循环遍历子节点下的信息
for(int j=0;j<geoNumber.size();j++) {
System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" "+geoNumber.get(j).get("y").getDoubleValue());
}
}