Сгладить JSON в конкретном формате

Я хотел бы использовать Java, чтобы взять тело JSON, перебирать записи и выводить каждую другую запись в новый массив JSON. Каждый набор из двух записей будет его собственным массивом, и мне нужно только взять первый в каждом соответствующем массиве. Я также буду предоставлять имена столбцов в исходном запросе, которые необходимо добавить к последующему сплющенному объекту. Например, допустим, у меня есть следующий модуль запроса JSON:

{
 "records": [
 [
 [
 "0DFC29E2-700E-4CC1-931E-B61DF4954B6B",
 "John Doe",
 "Teacher",
 "China"
 ],
 [
 "B5B9186E-CE65-4911-8516-C510D3CC3ACE",
 "Jane Doe",
 "Doctor",
 "London"
 ]
 ],
 [
 [
 "20C4DD07-4E96-47F8-A1E1-B20B4C48120C",
 "Jim Doe",
 "Lawyer",
 "Canada"
 ],
 [
 "76718CB1-238F-418E-BD14-5E2867FF3FB4",
 "Jack Doe",
 "Chef",
 "Mexico"
 ]
 ]
 ],
 "columns": [
 "ID",
 "Name",
 "Occupation",
 "Location"
 ]
}

Мне бы хотелось, чтобы этот тело запроса было сплющено следующим образом:

[{
 "ID": "0DFC29E2-700E-4CC1-931E-B61DF4954B6B",
 "Name": "John Doe",
 "Occupation": "Teacher",
 "Location": "China"
},
{
 "ID": "20C4DD07-4E96-47F8-A1E1-B20B4C48120C",
 "Name": "Jim Doe",
 "Occupation": "Lawyer",
 "Location": "Canada"
}]

Я хочу, чтобы этот код был довольно динамичным, поэтому он явно не ссылается на имена столбцов в коде. Таким образом, я могу передать другие имена столбцов в будущем, если у меня есть другая структура тела JSON, и она будет работать соответственно. Я всегда буду передавать данные с заголовком "записей", чтобы это было хорошо для жесткого кодирования. Любая помощь приветствуется.

2 ответа

Вы должны преобразовать исходный JSON в коллекцию карт. Каждая карта будет содержать имена свойств и значения свойств. После этого вы можете легко преобразовать его в ожидаемый формат. В приведенном ниже примере я использую Jackson библиотеку, но я думаю, что вы должны использовать Gson.

Сначала мы должны определить класс SourceEntity, который определяет все свойства для ввода JSON.

class SourceEntity {
 private String[][][] records;
 private String[] columns;
 public String[][][] getRecords() {
 return records;
 }
 public void setRecords(String[][][] records) {
 this.records = records;
 }
 public String[] getColumns() {
 return columns;
 }
 public void setColumns(String[] columns) {
 this.columns = columns;
 }
}

После этого мы должны написать конвертер, который может анализировать входные данные JSON, преобразовывать массивы в коллекцию карт и сериализовывать их для целевой JSON.

class JsonConverter {
 private ObjectMapper objectMapper = new ObjectMapper();
 private JsonFactory jsonFactory = new JsonFactory();
 public String convert(File sourceJsonFile) throws Exception {
 SourceEntity sourceEntity = parseSourceEntity(sourceJsonFile);
 List<map<string, string="">> result = convertToTargetPropertiesMap(sourceEntity);
 return objectMapper.writeValueAsString(result);
 }
 private SourceEntity parseSourceEntity(File sourceJsonFile)
 throws Exception {
 JsonParser parser = jsonFactory.createJsonParser(sourceJsonFile);
 return objectMapper.readValue(parser, SourceEntity.class);
 }
 private List<map<string, string="">> convertToTargetPropertiesMap(
 SourceEntity entity) {
 List<map<string, string="">> list = new ArrayList<map<string, string="">>();
 for (String[][] pairs : entity.getRecords()) {
 list.add(createPropertyMap(entity.getColumns(), pairs[0]));
 }
 return list;
 }
 private Map<string, string=""> createPropertyMap(String[] names,
 String[] values) {
 Map<string, string=""> propertyMap = new LinkedHashMap<string, string="">();
 for (int i = 0; i < values.length; i++) {
 propertyMap.put(names[i], values[i]);
 }
 return propertyMap;
 }
}
</string,></string,></string,></map<string,></map<string,></map<string,></map<string,>

Наконец, мы должны написать небольшой тест:

import java.io.File;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonProgram {
 public static void main(String[] args) throws Exception {
 JsonConverter converter = new JsonConverter();
 String result = converter.convert(new File("/tmp/source.json"));
 System.out.println(result);
 }
}

Выше программы печатает этот JSON для ввода вашего примера:

[{"ID":"0DFC29E2-700E-4CC1-931E-B61DF4954B6B","Name":"John Doe","Occupation":"Teacher","Location":"China"},{"ID":"20C4DD07-4E96-47F8-A1E1-B20B4C48120C","Name":"Jim Doe","Occupation":"Lawyer","Location":"Canada"}]


Вы можете прочитать исходный JSON в кучу объектов Java, сделать преобразование на стороне Java и вывести его в новом формате.

Было бы неплохо, если бы был JSON эквивалент XSLT, но я не видел того, что обычно используется.

licensed under cc by-sa 3.0 with attribution.