逼格高的蛋挞 · node.js ...· 1 年前 · |
帅气的消防车 · 在 Azure Boards ...· 1 年前 · |
追风的小笼包 · javascript - How to ...· 1 年前 · |
近视的包子 · 什么?后端要一次性返回我10万条数据!且看我 ...· 1 年前 · |
有没有办法通过json schema将映射转换成json字符串?我需要通过json schema来做这件事,因为我不知道map中的对象是字符串还是数字。例如,我的csv如下所示:
name, year
1 , 1
我需要将其转换为json字符串
"{'name': '1', 'year': 1}"
,只有通过json模式,我才能知道1是字符串(在名称的情况下)还是数字(在年份的情况下)。
您可以使用org.json库:
Map<String, Object> map = new HashMap<>();
map.put("name", "1");
map.put("year", 1);
org.json.JSONObject obj = new org.json.JSONObject(map);
System.out.println(obj.toString());
输出:
{"year":1,"name":"1"}
您可以使用GSON。它非常容易使用,而且功能非常强大。现在,我能够解决这个库中的所有问题。( https://github.com/google/gson )
// your map
Map<String, Object> map = new HashMap<>();
map.put("name", "1");
map.put("year", 1);
// create Gson instance
Gson gson = new GsonBuilder().create();
// convert to JSON
String jsonString = gson.toJson(map);
// convert back to map
Map map = gson.fromJson(jsonString, Map.class);
杰克逊有一份 module to parse CSV 文件。假设您的项目中已经有Jackson依赖项,则需要根据需要添加以下内容:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>${jackson.version}</version>
</dependency>
然后创建一个类来定义您的模式并保存这些值(请注意
@JsonPropertyOrder
注释,因为它定义了CSV列的顺序):
@JsonPropertyOrder({"name", "year"})
public class Person {
private String name;
private Integer year;
// Getters and setters
}
将CSV文档解析为列表,最后将列表写入JSON字符串:
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(Person.class).withHeader();
MappingIterator<Object> iterator = mapper.readerFor(Person.class)
.with(schema).readValues(new FileInputStream("/path/to/the/csv/file"));
String json = new ObjectMapper().writeValueAsString(iterator.readAll());
在我读完你的评论后,我建议这就是你所需要的。这是一个简单的Java解决方案。我猜有一些库可以帮助你解析csv。我希望我能帮到你
给定CSV:
name,year
test,38
foo,78
Java代码:
try {
File file = ResourceUtils.getFile(this.getClass().getResource("/import.csv"));
List<List<String>> lines = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
String[] values = line.split(",");
lines.add(Arrays.asList(values));
Map<String,Integer> resultMap = new HashMap<>();
for (int i = 1; i < lines.size(); i++) {
List<String> currentLine = lines.get(i);
String name = currentLine.get(0);
String year = currentLine.get(1);
if(StringUtils.isNoneEmpty(name,year) && StringUtils.isNumeric(year)){
resultMap.put(name,Integer.valueOf(year));
Gson gson = new GsonBuilder().create();
String jsonString = gson.toJson(resultMap);
System.out.println(jsonString);
} catch (IOException e) {
System.out.println(e);
}
输出将为:
{"1":1,"test":38,"foo":78}
你可以使用Jackson来尝试这样的东西:
您唯一需要自己实现的是第二个方法,它将CsvSchema.json转换为包含列名和列类型的映射。
public String generateJsonFromCSV() throws IOException {
File csvFile = new File("path/to/csv/mycsv.csv");
File schemaJson = new File("path/to/json/schema.json");
Map<String, CsvSchema.ColumnType> map = getSchemaMapFromJson(schemaJson);
CsvSchema.Builder schemaBuilder = new CsvSchema.Builder();
map.forEach(schemaBuilder::addColumn);
CsvSchema schema = schemaBuilder.build();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Map<?, ?>> mappingIterator = csvMapper.readerFor(Map.class).with(schema).readValues(csvFile);
String json = new ObjectMapper().writeValueAsString(mappingIterator.readAll());
return json;
//Convert your JsonSchema to Map<String,CsvSchema.ColumnType>
private Map<String, CsvSchema.ColumnType> getSchemaMapFromJson(File file) {