json - 자바 - 한글 유니코드



MOXy JAXB는 UTF-8 인코딩이 지정되면 유니 코드(u+2019)에 대한 잘못된 제어 문자를 마샬링합니다. (1)

이클립스 Moxy를 사용하여 클래스를 JSON으로 마샬링하려고 할 때 매우 성가신 오류가 발생했습니다.

내 도메인 클래스 중 하나에 다음 값을 가진 특성이 있습니다 : "the City's original city site" 에는 코드 포인트 u + 2019 ( ')가 포함되어 있습니다.

Jaxb가이 가치를 마샬링하려 할 때, 나는 이상한 통제를 되 찾을 수 없습니다 : "Citys original city site"

결과적으로 디코딩 될 때 null 값을 반환하는 잘못된 JSON이 발생합니다. 나는 이것을 Jackson과 함께 시도해 보았고 ascii 이스케이프 문자를 받는다. 여전히 잘못된 것이지만 적어도 유효한 JSON을 만든다!

Moxy는 '유효한 유니 코드 문자이며 JSON 내에서 유효하므로 올바르게 출력 할 수 있어야합니다. '(및 다른 유니 코드 문자)를 올바르게 출력하고 바람직하지 않게이 불필요한 문자를 정규 아포스트로피로 변환 할 수있는 방법이 있습니까?

다음은 내 공급자 클래스입니다.

@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");
    }

}

나는 Moxy 버전 2.5.1을 사용하고있다.

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

이론적으로 값 (postgres, jdbc, hibernate, cxf 및 tomcat)을 망칠 수있는 시스템의 여러 구성 요소가 있지만 그 값이 내 도메인 클래스에 올바르게 저장되어 있는지 테스트 한 다음 Elliot Spitzer와 같이 손상되었습니다. 마샬링 단계에서 창녀를 방문하십시오.


참고 : 저는 EclipseLink JAXB (MOXy) 리드이며 JAXB (JSR-222) 전문가 그룹의 멤버입니다.

업데이트 # 3

이 문제는 이제 EclipseLink 2.5.2 및 2.6.0 스트림에서 수정되었습니다. 2013 년 10 월 10 일부터 다음 위치에서 야간 빌드를 다운로드 할 수 있습니다.

또는 Maven에서

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

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

업데이트 # 2

다음 버그로이 문제에 대한 진행 상황을 추적 할 수 있습니다.

업데이트 # 1

EclipseLink 2.5.0에서 사례 연구를 사용합니다. EclipseLink 2.5.1에서 수행 한 성능 문제로 인해 다음과 같은 오류가 발생합니다.

논리 해답

Writer for JSON (XML은 올바르게 작동 함)에 존재하지 않는 OutputStream 에 대한 마샬링에 버그가있는 것으로 보입니다. 아래는 나의 빠른 조사에서 밝혀낸 것입니다. 더 많은 정보를 얻으면 대답을 업데이트 할 것입니다.

Java 모델

public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

데모 코드

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));
    }

}

산출

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