Преобразовать карту в строку json по схеме json - PullRequest
0 голосов
/ 08 марта 2019

Есть ли способ преобразовать карту в строку json по схеме json? Мне нужно сделать это по схеме JSON, потому что я не знаю, является ли объект на карте строкой или числом. Например, у меня есть CSV, который выглядит так:

name, year
1   , 1

Мне нужно преобразовать его в строку json "{'name': '1', 'year': 1}", и я могу знать, является ли 1 строкой (в случае имени) или числом (в случае года) только по схеме json.

Ответы [ 5 ]

2 голосов
/ 08 марта 2019

Джексон имеет модуль для анализа документов CSV . Предполагая, что у вас уже есть зависимости Джексона в вашем проекте, вам просто необходимо добавить следующее в зависимости:

<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());
1 голос
/ 11 марта 2019

Вы можете попробовать что-то вроде этого, используя Джексона:

Единственное, что вам нужно реализовать самостоятельно, - это второй метод преобразования вашего 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) {
        return new HashMap<>();
    }

Зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>${jackson.version}</version>
</dependency>
0 голосов
/ 08 марта 2019

После прочтения ваших комментариев я полагаю, что это то, что вам нужно.Это простое решение Java.Я предполагаю, что есть библиотеки, которые могут помочь вам разобрать CSV.Я надеюсь, что смог вам помочь

С учетом CSV:

name,year
1,1
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}
0 голосов
/ 08 марта 2019

Вы можете использовать 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);
0 голосов
/ 08 марта 2019

Вы можете использовать библиотеку 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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...