Используйте имя класса в качестве корневого ключа для сериализации Jackson JSON

измените свою базу данных на метод 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));");
27
задан John McCarthy 28 November 2012 в 21:06
поделиться

6 ответов

Добавив аннотацию Джексона @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
    }
}
32
ответ дан Arun Prakash 28 November 2019 в 04:22
поделиться

Ниже приведен способ достижения этого

Map<String, MyPojo> singletonMap = Collections.singletonMap("mypojo", mp);
System.out.println(mapper.writeValueAsString(singletonMap));

Вывод {"mypojo": {"id": 4}}

Здесь преимущество заключается в том, что мы можем указать наше имя для корневого ключа объекта json. Согласно приведенному выше коду, mypojo будет корневым ключом. Этот подход будет наиболее полезен, когда мы используем шаблон сценария java, такой как Mustache.js, для итерации объектов json

12
ответ дан Anish George 28 November 2019 в 04:22
поделиться

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

Переопределить: 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;

Таким образом, я получаю больше контроля и могу использовать другие виды фильтров.

1
ответ дан Garry 28 November 2019 в 04:22
поделиться

Я не использую Джексона, но при поиске я нашел эту конфигурацию, которая, похоже, именно то, что вам нужно: WRAP_ROOT_VALUE

Функция, которую можно включить для создания корневого значения (обычно объект JSON, но может быть любого типа) завернутый в один объект JSON свойства, где ключ является «корневым именем», как определено интроспектором аннотации (особенно для JAXB, который использует @ XmlRootElement.name) или резервным вариантом (неквалифицированное имя класса). Функция в основном предназначена для совместимости с JAXB.

Значение по умолчанию - false, то есть корневое значение не переносится.

Чтобы вы могли настроить mapper:

objectMapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);

Надеюсь, это поможет вам ...

25
ответ дан 28 November 2019 в 04:22
поделиться

Как насчет простейшего возможного решения; просто используйте класс-оболочку, например:

class Wrapper {
   public MyPojo MyPojo;
}

и обертывание / развертывание в вашем коде?

Помимо этого, было бы полезно узнать, ПОЧЕМУ вам нужна дополнительная запись объекта json, подобная этой? Я знаю, что это делается библиотеками, которые эмулируют json через xml api (из-за сопротивления между xml и json из-за преобразования из xml в json), но для чистых решений json это обычно не требуется.

Это для того, чтобы вы смогли выяснить, что это за тип на самом деле? Если да, то, возможно, вы могли бы рассмотреть возможность включения информации о полиморфном типе, чтобы Джексон обрабатывал ее автоматически? (подробности см. в примечания к выпуску 1.5 , запись для PTH).

1
ответ дан 28 November 2019 в 04:22
поделиться

Мне было бы интересно услышать решение 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);

Это немного похоже на хакерство, но работает хорошо.

0
ответ дан 28 November 2019 в 04:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: