JSON 数组序列化问题

Apache CXF 错误(仅发生在 JSON 回复格式中)

请求 JSON 格式的酒店列表回复时,如果 HotelSummaryRoomRateDetails 等数组元素只包含一个酒店/客房,将无法正确进行序列化。在这些情况下,数组将以单个实例形式返回,而不是哈希表,这在某些编码环境中会产生问题。

示例:

由 Apache 发布: http://cxf.apache.org/docs/jax-rs-data-bindings.html

处理 JSON 数组序列化问题

JSON 社区存在一个众所周知的问题,即对仅包含一个值的列表对象进行序列化会出错。要解决此问题,需要在 JSON 提供程序上启用“serializeAsArray”功能,并通过其他选项指定需要使用“arrayKeys”属性进行相应处理的各个字段。

请注意,“serializeAsArray”和“arrayKeys”可结合生成所谓的自然惯例序列。

一个解决方法示例:

<util:list id="jsonKeys"><value>HotelSummary</value></util:list>

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
  <property name="serializeAsArray" value="true" />
  <property name="arrayKeys" ref="jsonKeys" />
</bean>

您自己的框架可能需要不同的代码。此处提供的代码仅作为示例。

预订请求中存在无法解决的错误或验证问题

使用某些技术时(包括 PHP 和 Java),如果请求中缺少正确的content-type值,用户会在传输格式正确的预订请求时遇到问题。

如果您进行了故障排除,且验证了预订请求 URL 结构,但仍然遇到无法解决的错误,请尝试在 HTTP 标题中进行如下设置:

Content-type:application/x-www-form-urlencoded Accept:application/xml

此外,请记住仅使用&_type=json&_type=xml设置回复格式。EAN 只接受 XML 内容。

有关Content Type的详细信息,请参见预订请求 概述。

Java 手动转换代码

从传输的 8859-1 代码手动转换为 UTF-8 代码的示例。

private static String convertEncoding(String value) {
        if (value != null) {
            try {
                return new String(value.getBytes("8859_1"), "UTF-8");

            } catch (UnsupportedEncodingException e) { 
                LOG.error("不支持的编码。", e);
            }
        }

        return value;
    }

Axis 用户

Axis 错误

某些版本的 Axis 中存在一个已知错误,该错误导致无法准确地生成源文件:除产生其他问题外,该错误还会更改某些数据类型(将“int”改为“integer”),以致生成的源文件不正确。在尝试进行编译时,这些不准确的内容会造成源文件出错,或导致源文件无法与 EAN Web 服务成功交互。

您可以在编译前更正源文件中的数据类型,也可以访问 http://ws.apache.org/axis/ 以更新至已修复该错误的更高 Axis 版本

您可以使用任何能够满足您的应用程序需求的版本。对于服务器应用程序或服务器问题,我们无法提供帮助。

Axis 1.4 错误

Axis 1.4 版本中存在一个已知错误,该错误导致即使指定了 min occurrence=0 和 nillable=false 时也会创建 nillable 定义。

当尝试与 EAN Web 服务成功交互时,这些不准确的内容会导致请求出错。

有关解决此问题的建议,请访问 http://ws.apache.org/axis/

您可以使用任何能够满足您的应用程序需求的版本。对于服务器应用程序或服务器问题,我们无法提供帮助。

.NET 用户

.NET 知识库

默认情况下,.NET Framework 在 machine.config 中的最大连接数为 2。这表示,每个工作进程一次只能对 2 个连接进行远程 Web 调用。如果响应时间较长或 Web 服务调用超时,您可能需要在服务器设置中查看有关这方面的详细信息。

与性能相关的其他有用 .NET 链接:

CS.NET/MS WSDL 2.0+ 问题

一些联盟伙伴向我们报告,在生成适用于 C# 的 HotelFunctions.cs 文件时遇到问题。此问题似乎出现在 WSDL 2.0 或更高版本中。WSDL 1.1 及更低版本在生成源文件时不会创建其他元素。

此过程似乎除了生成其他 nillable 元素外,还会生成自己的名为 hotelIdSpecified 的元素,且该元素的默认值为 false。

  • 这会导致请求中的酒店 ID(或任何其他生成此“指定”项的项)被忽略,从而生成指示无法解析酒店 ID 的错误。
  • 您必须在代码中手动将该项更改为 true,以便 C# 能够发送获得可订空房结果所需的酒店 ID(或任何其他生成该指定元素的项)。
  • hotelIdSpecified(或任何其他“指定”项)不是 WSDL 或 Web 服务请求对象的一部分,因此在文档中找不到该元素。
  • VB.NET 和 MS WSDL 1.1 中不存在此问题,而且生成 HotelFunctions.vb 时不会创建新元素。

如果您有更多有关此问题的信息,请联系我们,我们非常乐意接受您的信息,也愿意更正当前发布的信息。

在 VS 中,文档正则表达式替换: 查找: private bool {.*}FieldSpecified; 替换: private bool \1FieldSpecified = true;