JAX-RS Джерси JSON сохранить ноль, используя аннотации - PullRequest
6 голосов
/ 05 января 2012

Как у меня JAXB сохраняет нули при получении строки JSON, которая содержит ноль или значение "".

Строка: {"id":null,"fname":"John","region":""}

возвращает объект:

 Person {
    Integer id = 0
    String fname = "John"
    Region regions = 0 }

Я бы хотел вернуть ноль вместо 0

Вот что у меня естьдо сих пор:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private JAXBContext context;
    private Class<?>[] types = {Person.class};

    public JAXBContextResolver() throws Exception {
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types);
    }

    public JAXBContext getContext(Class<?> objectType) {
        for (Class<?> c : types) {
            if (c.equals(objectType)) {
                return context;
            }
        }
        return null;
    }
}

Person.class помечен @XmlRootElement Я пытался изучить аннотации Джексона, но безуспешно.

Ответы [ 2 ]

3 голосов
/ 09 мая 2012

Примечание: Я EclipseLink JAXB (MOXy) и член JAXB (JSR-222) экспертная группа.

Ниже приведен пример того, как это можно сделать с помощью MOXy.

Человек

MOXy будет демонтировать объект Person так, как вам нужно, без указания каких-либо метаданных. Чтобы выходной JSON содержал нулевые значения, вы можете использовать аннотацию @XmlElement(nillable=true) (см. Привязка к JSON и XML - Обработка пустых значений ).

package forum8748537;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

    @XmlElement(nillable=true)
    Integer id;

    @XmlElement(nillable=true)
    String fname;

    @XmlElement(nillable=true)
    Region regions;

}

jaxb.properties

Чтобы указать MOXy в качестве вашего провайдера JAXB (JSR-222), вам нужно добавить файл с именем jaxb.properties в тот же пакет, что и классы вашего домена, со следующей записью (см. Указание EclipseLink MOXy в качестве вашего провайдера JAXB ).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Демо

package forum8748537;

import java.io.StringReader;
import java.util.*;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(2);
        properties.put("eclipselink.media-type", "application/json");
        properties.put("eclipselink.json.include-root", false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Person.class}, properties);

        StringReader json = new StringReader("{\"id\":null,\"fname\":\"John\",\"region\":\"\"}");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Person person = unmarshaller.unmarshal(new StreamSource(json), Person.class).getValue();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(person, System.out);
    }

}

выход

{
   "id" : null,
   "fname" : "John",
   "regions" : null
}

Использование MOXy в приложении JAX-RS

Пример использования MOXy в приложении JAX-RS см.

0 голосов
/ 29 января 2018

Начиная с JSON-B JSR-367 (JAX-RS 2.1 JSR-370), вместо @ XmlElement работает следующая аннотация.

@JsonbProperty(nillable = true)
...