IBM MobileFirst/Worklight JSON
Posted
技术标签:
【中文标题】IBM MobileFirst/Worklight JSON【英文标题】: 【发布时间】:2015-05-20 03:34:20 【问题描述】:在 IBM MobileFirst 7.0 中,我通过将 MobileFirst Platform Studio 指向在本地 Web 服务器上运行的 WSDL 创建了一个 SOAP 适配器。当调用 SOAP 适配器时,它将 JSON 转换为 XML,然后当从 XML 接收到响应返回到 JSON 时,它在 JSON 中设置数字(整数、十进制)和布尔值作为字符串返回,即在响应中用双引号将它们括起来而不是不引用它们。我没有更改 MFP Studio 自动生成的适配器中的任何内容。据我了解,在 JSON 中,布尔值和数字以及空值都没有被引用。我还有一个通过 Spring Boot 运行的非 MobileFirst Web 服务器,使用 WebServiceGatewaySupport
调用相同的 SOAP 服务和 @ResponseBody
注释让它自动返回 JSON,并且数字和布尔值不在返回的字符串中的双引号中。
是否期望 MobileFirst/Worklight 在 JSON 正文中以 String
的形式返回所有内容?如果是这样,为什么?如果没有,关于我可能需要做什么才能避免这种情况发生以及不引用数字和布尔值的任何想法?
以下是 WSDL 的相关部分以及向/来自 Worklight SOAP 适配器的 JSON 请求/响应。
<xs:element name="customerFoodOrderRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="customerId" type="xs:int"/>
<xs:element name="dateTime" type="xs:dateTime"/>
<xs:element name="item" type="xs:string"/>
<xs:element name="amount" type="tns:money"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="money">
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="customerFoodOrderResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="success" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getRecentFoodOrdersForCustomerRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="customerId" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getRecentFoodOrdersForCustomerResponse">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:element name="foodOrders" type="tns:foodOrder"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="foodOrder">
<xs:sequence>
<xs:element name="dateTime" type="xs:dateTime"/>
<xs:element name="item" type="xs:string"/>
<xs:element name="amount" type="tns:money"/>
</xs:sequence>
</xs:complexType>
JSON 响应 #1(amount
是一个 xs:decimal 封装在名为 money
的 SimpleType 中,但它作为字符串输出到 JSON)
"Envelope":
"Body":
"getRecentFoodOrdersForCustomerResponse":
"foodOrders":
"amount": "10",
"dateTime": "2015-02-14T12:00:00.123-07:00",
"item": "MyItem"
,
"ns2": "http:\/\/company.com\/demo\/demo-producing-web-service"
,
"Header": "",
"SOAP-ENV": "http:\/\/schemas.xmlsoap.org\/soap\/envelope\/"
,
"errors": [
],
"info": [
],
"isSuccessful": true,
"responseHeaders":
"Accept": "text\/xml, text\/html, image\/gif, image\/jpeg, *; q=.2, *\/*; q=.2",
"Content-Length": "444",
"Content-Type": "text\/xml;charset=utf-8",
"Date": "Wed, 20 May 2015 02:58:26 GMT",
"SOAPAction": "\"\"",
"Server": "Apache-Coyote\/1.1"
,
"responseTime": 328,
"statusCode": 200,
"statusReason": "OK",
"totalTime": 359,
"warnings": [
]
JSON 响应 #2 带有布尔值 success
双引号:
"Envelope":
"Body":
"customerFoodOrderResponse":
"ns2": "http:\/\/company.com\/demo\/demo-producing-web-service",
"success": "true"
,
"Header": "",
"SOAP-ENV": "http:\/\/schemas.xmlsoap.org\/soap\/envelope\/"
,
"errors": [
],
"info": [
],
"isSuccessful": true,
"responseHeaders":
"Accept": "text\/xml, text\/html, image\/gif, image\/jpeg, *; q=.2, *\/*; q=.2",
"Content-Length": "304",
"Content-Type": "text\/xml;charset=utf-8",
"Date": "Wed, 20 May 2015 02:46:02 GMT",
"SOAPAction": "\"\"",
"Server": "Apache-Coyote\/1.1"
,
"responseTime": 764,
"statusCode": 200,
"statusReason": "OK",
"totalTime": 796,
"warnings": [
]
JSON 响应 #3(客户 ID 用双引号括起来,即使它被定义为 xs:int)
"customer":
"accountNumber": "11127174",
"firstName": "JOHN",
"id": "200",
"lastName": "DOE",
"status": "None"
,
来自 WSDL 的客户定义
<xs:complexType name="customer">
<xs:sequence>
<xs:element name="id" type="xs:int"/>
<xs:element minOccurs="1" name="firstName" nillable="false" type="xs:string"/>
<xs:element minOccurs="1" name="lastName" nillable="false" type="xs:string"/>
<xs:element minOccurs="1" name="status" nillable="false" type="tns:status"/>
<xs:element name="accountNumber" type="xs:string"/>
</xs:sequence>
</xs:complexType>
【问题讨论】:
【参考方案1】:是的,来自 Worklight 适配器的所有响应都将转换为 JSON 在到达客户端设备(移动设备、Web 浏览器等)之前
要更清楚地了解适配器的结构和工作原理,请阅读下面的链接Overview of worklight Adapters
接下来为什么Json总是比XML好?
-
JSON 比 XML 有几个优点。它更小且不那么臃肿,因此您通过网络传递的数据要少得多 - 对于移动设备而言,这将产生相当大的影响。
它也更易于在 javascript 代码中使用,因为您可以简单地将数据包直接传递到 javascript 数组中,而无需任何解析、提取和转换,因此 CPU 密集度也大大降低。
这些是需要考虑的一些要点,以及有关此consider this link 的更多详细信息,也可以通过 Google 自己获取更多信息。
注意
-
您可以根据需要使用 xsl 来转换 json,但我建议您使用 parseInt 来代替,当您阅读 customer.accountNumber 时,它会给您 11127174 而不是“11127174”,因此很容易处理用 JAVASCRIPT 方式比用 xsl 来做
我们无法更改 worklight 行为,但您可以使用 XSL 将 xml 转换为 JSON 格式,无需引号等,您可以将 xml 更改为您自己的 JSON 格式
【讨论】:
感谢您的回复!我在上面澄清了我的问题。我知道一切都转换为 JSON,我期待着。但是,我的问题与为什么响应 JSON 中的所有内容都转换为字符串有关,而数字和布尔值应该在 JSON 正文中不加引号(而不是字符串)。正如您从上面的 JSON 响应中看到的那样,当适配器以 JSON 形式返回时,WSDL 中定义为 xs:int、xs:decimal 和 xs:boolean 的字段正在由 Worklight 适配器转换为字符串。如何防止它们被引用以使 JSON 正确。 @kglee79 您可以根据需要使用 xsl 转换 json,但我会建议您使用 parseInt 而不是那个,当您阅读customer.accountNumber
时,它会给您 11127174
而不是"11127174"
所以用 JAVASCRIPT 方式处理它比使用 xsl 容易
@ KawineshSK 所以适配器的默认行为是返回将所有内容转换为字符串的 JSON 并且没有办法更改它?如果是这样,那么听起来我需要在返回 JSON 之前拦截它并手动通过它来将所有数字、布尔值和可能的空值更改为它们的非字符串表示形式?我确实注意到它使用 Spring 对返回的数据进行验证,所以我希望有一些方法可以返回包含根据其基础数据类型的数据的 JSON,这就是 Spring 在我的 Spring Boot 服务器上所做的。
@kglee79 是的,您不能更改工作灯行为,但您可以通过使用 XSL 将 xml 转换为 JSON 格式,如您所愿,无需引号等,将 xml 更改为您自己的 JSON 格式
您可能需要提交增强请求以在未来版本中改进产品。请参阅此处的“提交增强功能”主题:developer.ibm.com/mobilefirstplatform/help以上是关于IBM MobileFirst/Worklight JSON的主要内容,如果未能解决你的问题,请参考以下文章
在 IBM 容器上运行 IBM MobileFirst Platform Foundation
没有 ibm 云功能的 ibm watson webhook