измените свою базу данных на метод Create на этот:
db.execSQL("CREATE TABLE IF NOT EXISTS comentario(_id integer,
nome text not null,
correo text not null,
texto text not null,
idLoc integer not null, primary key (_id));");
Добавив аннотацию Джексона @JsonTypeInfo
на уровне класса, вы можете получить ожидаемый результат. я просто добавил без изменений в вашем классе.
package com.test.jackson;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)
public class MyPojo {
// Remain same as you have
}
вывод:
{
"MyPojo": {
"id": 4
}
}
Ниже приведен способ достижения этого
Map<String, MyPojo> singletonMap = Collections.singletonMap("mypojo", mp);
System.out.println(mapper.writeValueAsString(singletonMap));
Вывод {"mypojo": {"id": 4}}
Здесь преимущество заключается в том, что мы можем указать наше имя для корневого ключа объекта json. Согласно приведенному выше коду, mypojo будет корневым ключом. Этот подход будет наиболее полезен, когда мы используем шаблон сценария java, такой как Mustache.js, для итерации объектов json
есть другой способ, который я использовал, и он работал для меня. Я работаю со сторонним флягой, поэтому я не контролирую аннотации. Так что мне пришлось писать через хак.
Переопределить: org.codehaus.jackson.map.ser.BeanSerializerFactory.findBeanProperties(SerializationConfig, BasicBeanDescription)
Добавьте вашу собственность, как показано ниже
List<BeanPropertyWriter> props = super.findBeanProperties(config, beanDesc);
BeanPropertyWriter bpw = null;
try {
Class cc = beanDesc.getType().getRawClass();
Method m = cc.getMethod("getClass", null);
bpw = new BeanPropertyWriter("$className", null, null, m, null,true, null);
} catch (SecurityException e) {
// TODO
} catch (NoSuchMethodException e) {
// TODO
}
props.add(bpw);
return props;
Таким образом, я получаю больше контроля и могу использовать другие виды фильтров.
Я не использую Джексона, но при поиске я нашел эту конфигурацию, которая, похоже, именно то, что вам нужно: WRAP_ROOT_VALUE
Функция, которую можно включить для создания корневого значения (обычно объект JSON, но может быть любого типа) завернутый в один объект JSON свойства, где ключ является «корневым именем», как определено интроспектором аннотации (особенно для JAXB, который использует @ XmlRootElement.name) или резервным вариантом (неквалифицированное имя класса). Функция в основном предназначена для совместимости с JAXB.
Значение по умолчанию - false, то есть корневое значение не переносится.
Чтобы вы могли настроить mapper:
objectMapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
Надеюсь, это поможет вам ...
Как насчет простейшего возможного решения; просто используйте класс-оболочку, например:
class Wrapper {
public MyPojo MyPojo;
}
и обертывание / развертывание в вашем коде?
Помимо этого, было бы полезно узнать, ПОЧЕМУ вам нужна дополнительная запись объекта json, подобная этой? Я знаю, что это делается библиотеками, которые эмулируют json через xml api (из-за сопротивления между xml и json из-за преобразования из xml в json), но для чистых решений json это обычно не требуется.
Это для того, чтобы вы смогли выяснить, что это за тип на самом деле? Если да, то, возможно, вы могли бы рассмотреть возможность включения информации о полиморфном типе, чтобы Джексон обрабатывал ее автоматически? (подробности см. в примечания к выпуску 1.5 , запись для PTH).
Мне было бы интересно услышать решение OP для этого. У меня возникают аналогичные проблемы, когда моя веб-служба RESTful сериализует объекты как XML или JSON для клиентов. Клиенты Javascript должны знать тип упаковки, чтобы иметь возможность анализировать ее. Связывание типа с шаблоном URI не вариант.
Спасибо.
Редактировать: я заметил, что Spring MappingJacksonJsonMarshaller добавляет класс упаковки при маршалинге, поэтому я прошел через код при отладке и заметил, что Spring передает HashMap с одной парой ключ-значение, так что ключом является имя упаковки и значение - это объект. Итак, я расширил JacksonJaxbJsonProvider, переопределил метод writeTo () и добавил следующее:
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(value.getClass().getSimpleName(), value);
super.writeTo(map, type, genericType, annotations, mediaType, httpHeaders,entityStream);
Это немного похоже на хакерство, но работает хорошо.