Мой код ниже, чтобы генерировать JSON с помощью Джексона, прекрасно до тех пор, пока данные обеспокоены, но не в формате JSONСоздать действительный JSON с помощью Джексона, который содержит массив и настраиваемое поле
Сформированный JSON оленья кожа перейдите JSONLint, потому что он получил цитаты вокруг квадратных скобок и цитаты вокруг запятых. Это также обратные косые, которые я взломан из него - но Im уверен, что там что-то не так с тем, что Im делает ниже
Вот то, что я пытаюсь сделать:
JSON должен выглядеть следующим образом (с исключение из skip
поля, которое я добавил здесь, чтобы подчеркнуть, что он будет исключен из объекта при сериализованном):
{
"users": [{
"foo": "abc1",
"bar": "def1",
"skip": "this field is skipped"
}, {
"foo": "abc2",
"bar": "def2",
"skip": "this field is skipped"
}],
"uri": "/users"
}
Пользователи Key представляет собой массив пользователей - 2-х элементов, показанных выше. Поле пропуска не должна быть частью окончательного JSON, но его часть каждого пользователя «» объекта добавляется
поля URI
Моего код находится ниже. Он успешно пропускает поле «skip», и он успешно строит строку, которая является почти JSON, если будет устранено странное форматирование. Но я признаю, что этот код ужасен, и это может быть лучше (хотя я не знаю, как с Im im к этому)
Какое неудобство вы спрашиваете?
- слэш (что вы можете видеть я устранил с помощью hackey регулярных выражений)
- Котировки вокруг [и]
- Котировки вокруг, (запятая)
Код:
get("/users", (request, response) -> {
//this is the array of objects
Object[] allUsers = listenUp.get_all_users();
//Ignore this field per ListenUpUser object
String[] ignorableFieldNames = { "skip" };
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.addMixIn(Object.class, PropertyFilterMixIn.class);
FilterProvider filters = new SimpleFilterProvider()
.addFilter("filter properties by name",
SimpleBeanPropertyFilter.serializeAllExcept(
ignorableFieldNames));
ObjectWriter writer = mapper.writer(filters);
ArrayNode array = mapper.createArrayNode();
for(int i = 0; i < allUsers.length; i++) {
array.add(writer.writeValueAsString(allUsers[i]));
}
JsonNodeFactory nodeFactory = JsonNodeFactory.instance;
ObjectNode child = mapper.createObjectNode();
child.put("users", array.toString());
child.put("uri", "/users");
response.status(200);
response.type("application/json");
String a = child.toString().replaceAll("\\\\", "");
return a;
});
Это определено в верхней части файла (для логики поля пропуска)
@JsonFilter("filter properties by name")
class PropertyFilterMixIn {}
Если вы не хотите кавычки в списке, то почему вы делаете 'child.put («пользователи» , array.toString()); '? Просто поместите 'array', а не его строку –
Yup Я попытался это сделать, и результат еще больше bizzare: http://pastebin.com/fAfUcv92 – wrecktangle
Если вы используете Джексон, я не понимаю, почему вы вручную создаете класс JsonObject для вас. Просто используйте функцию сериализации Jackson –