Учитывая этот POJO:
public class People {
String sex;
long age;
String names;
}
Свойство «names» будет строкой json, для которой мне нужно создать вложенные документы. Вот пример экземпляра, который мне нужно сохранить в Elasticsearch с помощью Jest Client:
People people = new People();
people.setSex("Male");
people.setAge(21);
people.setNames("[{\"fname\": \"Bob\",\"lname\": \"Smith\"},[{\"fname\": \"Mike\",\"lname\": \"Johnson\"}");
Index index = new Index.Builder(people).index("indexName").type("aType").build();
jestClient.execute(index);
Результирующий документ в ES выглядит так:
"_source" : {
"sex" : "Male",
"age" : 21,
"names" : "[{\"fname\": \"Bob\",\"lname\": \"Smith\"},{\"fname\": \"Mike\",\"lname\": \"Johnson\"}]"
}
Таким образом, он взял имена строк и вставил их как буквальную строку, что имеет смысл, но на самом деле мне нужно создавать документы из каждого объекта имени. Другими словами, я хочу, чтобы это выглядело так:
"_source" : {
"sex" : "Male",
"age" : 21,
"names" : [{
"fname": "Bob",
"lname": "Smith"
}, {
"fname": "Mike",
"lname": "Johnson"
}]
}
Я попытался добавить сопоставление, чтобы указать ES рассматривать его как «вложенное», но затем я получаю исключение синтаксического анализа Mapper, говорящее: «Пытался проанализировать поле [имена] как объект, но нашел конкретное значение».
Я знаю, что смогу сделать это, если создам реальный объект Name POJO и получу их список, но, к сожалению, из-за требований я не могу этого сделать. Я должен использовать строку JSON, предоставленную в формате, указанном выше.
РЕШЕНИЕ:
Спасибо Вишалу Рао за то, что указал мне правильное направление.
Решение состояло в том, чтобы изменить тип «имена» на JsonArray (Google GSON). Затем использовал парсер Google GSON как таковой:
People people = new People();
people.setSex("Male");
people.setAge(21);
String json = "[{\"fname\": \"Bob\",\"lname\": \"Smith\"},[{\"fname\": \"Mike\",\"lname\": \"Johnson\"}"
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(json);
JsonArray jsonArray = jsonElement.getAsJsonArray();
people.setNames(jsonArray);
Index index = new Index.Builder(people).index("indexName").type("aType").build();
jestClient.execute(index);
Кроме того, у меня также есть сопоставление, которое устанавливает для свойства имен вложенный тип.