gpt4 book ai didi

json - 当指定 UTF-8 编码时,MOXy JAXB 会为 Unicode (u+2019) 编码(marshal)无效的控制字符

转载 作者:行者123 更新时间:2023-12-04 15:23:13 25 4
gpt4 key购买 nike

在尝试使用 Eclipse Moxy 将类编码为 JSON 时,我遇到了一个非常烦人的错误。

我的域类之一中有一个具有以下值的属性:"the City’s original city site"其中包含代码点 u+2019 (’)

当 Jaxb 试图编码这个值时,我莫名其妙地返回了一个奇怪的控件:"Citys original city site"
这会导致无效的 JSON,在解码时返回空值。我在 Jackson 上试过这个,并收到一个 ascii 转义字符,这仍然是错误的,但它至少可以生成有效的 JSON!

Moxy 应该能够正确输出它,因为 ' 是一个有效的 unicode 字符并且在 JSON 中有效。我能做些什么来正确输出 ’(和任何其他 unicode 字符),最好是将这个不必要的字符转换为常规撇号。

这是我的提供者类:

@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 日起,您将能够从以下位置下载每晚构建:

  • http://www.eclipse.org/eclipselink/downloads/nightly.php

  • 或者从 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

    以下错误可用于跟踪我们在此问题上的进展:
  • http://bugs.eclipse.org/419072


  • 更新 #1

    您的用例适用于 EclipseLink 2.5.0。我们在 EclipseLink 2.5.1 中进行的性能修复引入了失败:
  • http://bugs.eclipse.org/404449


  • 原答案

    我们对 OutputStream 的编码中似乎存在错误这在我们的编码中不存在 Writer对于 JSON(XML 工作正常)。以下是我的快速调查发现的内容。一旦我有更多信息,我会更新我的答案。

    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"
    }

    关于json - 当指定 UTF-8 编码时,MOXy JAXB 会为 Unicode (u+2019) 编码(marshal)无效的控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19257257/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com