json utf-8 jaxb marshalling moxy

json - MOXy JAXB asigna caracteres de control no válidos para Unicode(u+2019) cuando se especifica la codificación UTF-8



marshalling (1)

Nota: Soy el líder de EclipseLink JAXB (MOXy) y miembro del grupo de expertos JAXB (JSR-222) .

ACTUALIZACIÓN # 3

El problema ahora se ha solucionado en las transmisiones EclipseLink 2.5.2 y 2.6.0. Podrá descargar una creación nocturna a partir del 10 de octubre de 2013 desde la siguiente ubicación:

O desde Maven con

<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.5.2-SNAPSHOT</version> </dependency>

y

<repository> <id>oss.sonatype.org</id> <name>OSS Sonatype Staging</name> <url>https://oss.sonatype.org/content/groups/staging</url> </repository>

ACTUALIZACIÓN # 2

El siguiente error se puede utilizar para seguir nuestro progreso en este tema:

ACTUALIZACIÓN # 1

El caso de uso funciona en EclipseLink 2.5.0. Una corrección de rendimiento que creamos en EclipseLink 2.5.1 introduce el error:

RESPUESTA ORIGINAL

Parece que hay un error en nuestra clasificación de OutputStream que no existe en nuestra clasificación para Writer for JSON (XML funciona correctamente). Debajo está lo que mi rápida investigación ha descubierto. Actualizaré mi respuesta una vez que tenga más información.

Modelo de Java

public class Foo { private String bar; public String getBar() { return bar; } public void setBar(String bar) { this.bar = bar; } }

Código de demostración

import java.io.OutputStreamWriter; import java.util.*; import javax.xml.bind.*; import javax.xml.bind.Marshaller; import org.eclipse.persistence.jaxb.JAXBContextProperties; public class Demo { public static void main(String[] args) throws Exception { Map<String, Object> properties = new HashMap<String, Object>(); properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); JAXBContext jc = JAXBContext.newInstance(new Class[] {Foo.class}, properties); Foo foo = new Foo(); foo.setBar("the City’s original city site"); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // Broken marshaller.marshal(foo, System.out); // Works marshaller.marshal(foo, new OutputStreamWriter(System.out)); } }

Salida

{ "bar" : "the Citys original city site" }{ "bar" : "the City’s original city site" }

Me he encontrado con un error muy molesto al intentar ordenar una clase a JSON usando Eclipse Moxy.

Tengo un atributo con el siguiente valor en una de mis clases de dominio: "the City''s original city site" que contiene el punto de código u + 2019 ('')

Cuando Jaxb intenta calcular este valor, inexplicablemente recupero un extraño control: "Citys original city site"

Esto da como resultado un JSON no válido que devuelve un valor nulo cuando se decodifica. Intenté esto con Jackson, y recibí un personaje de escape de Ascii, que todavía está mal, ¡pero al menos es válido para JSON válido!

Moxy debería poder mostrar esto correctamente ya que ''es un carácter unicode válido y es válido dentro de JSON. ¿Hay algo que pueda hacer para generar el ''(y cualquier otro carácter Unicode) correctamente, y preferiblemente convertir este carácter innecesario en un apóstrofo regular.

Aquí está mi clase de proveedor:

@Provider @Component("customMOXyJsonProvider") public class CustomMOXyJsonProvider extends MOXyJsonProvider { @Override protected void preWriteTo(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller) throws JAXBException { marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8"); } }

Estoy usando la versión 2.5.1 de Moxy.

<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.5.1</version> </dependency>

Tengo varios componentes en mi sistema que teóricamente podrían arruinar el valor (postgres, jdbc, hibernate, cxf y tomcat), pero he determinado mediante pruebas que el valor se almacena correctamente en mi clase de dominio, y luego se corrompió, como Elliot Spitzer visitando a una prostituta, en el paso de clasificación.