WSO2 ESB无法将完整的JSON数据转换为XML
我正在建造一个POC。 我为Google Plus创建了传递代理服务。 不使用任何代理服务我得到这是我的输出:
{ "kind":"plus#person", "etag":"\"ExituU7aUpmkkfyD52VulzptThw/4J1clegrhxYC2fsJOu2XWCs1Ewg\"", "id":"117488614303967062311", "displayName":"Abhi NeoN", "name":{ "familyName":"NeoN", "givenName":"Abhi" }, "tagline":"hey guys ! ssup!! check out ma recnt videos... uploaded", "gender":"male", "aboutMe":"\u003cb\u003ehie, abhishek - ma full name \u003c/b\u003e\u003cdiv\u003e\u003cb\u003em a DANCER ,\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003ei luv ma dancing .\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003ei care ma dancing ,\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003ei jus hv a gr8 thng in me dats ma dancing.\u003c/b\u003e\u003c/div\u003e", "relationshipStatus":"single", "url":"https://plus.google.com/117488614303967062311", "image":{ "url":"http://sofzh.miximages.com/java/photo.jpg?sz=50" }, "urls":[ { "value":"https://plus.google.com/117488614303967062311", "type":"profile" }, { "value":"https://www.googleapis.com/plus/v1/people/117488614303967062311", "type":"json" } ], "organizations":[ { "name":"our lady of nazareth high school", "title":"science", "type":"school" }, { "name":"", "title":"BLUEBYTES", "type":"work" } ] }
但是当我尝试使用简单的传递服务来做同样的事情时,我只得到:
{ "kind":"plus#person" }
我在wso2esb网站上看到他们有一个错误,解决这个错误的解释是收到的json数据格式不正确。 但是现在我该如何解决这个问题。 我的意思是他们可以在esb将其转换为json数据之前操纵json数据。
我们已在最新版本的ESB(版本4.5.0)中解决了此问题。 默认情况下,它附带了JSONMessageFormatter / JSONBuilder,它可以处理具有多个密钥的JSON有效负载。
我们还提出了另一种处理消息流的解决方案,它涉及不同类型的JSON < - > XML(或JSON < - > JSON)转换。 JSONStreamBuilder
和JSONStreamFormatter
可用于使用’script’介体实现此类场景。 看看ESB 4.5.0中的示例#441。
运行样本#441;
- 在repository / conf / axis2 / axis2.xml文件中添加
JSONStreamBuilder
和JSONStreamFormatter
作为JSON的构建器和格式化程序 - 部署SimpleStockQuoteService
- 启动示例axis2server
- 使用’
ant newjsonclient
‘运行JSON客户端
这是当前axis2 JSON构建器/格式化程序的限制之一。 我们目前正在为JSON开发一个新的构建器/格式化程序对,它不会转换JSON < - > XML。 相反,它(构建器)将JSON消息存储为流,并且脚本介体可用于从该流构建JSON对象。 例如,如果我们在ESB中发送{“a”:“x”,“b”:“y”}作为请求,我们可以使用javascript将此请求作为JSON对象进行操作。
var a = mc.getJSON().a.toString(); var b = mc.getJSON().b.toString(); mc.setPayloadXML( {a} {b} );
类似地, mc.setJSON()
方法可用于设置任意JSON对象。
将json可靠地转换为xml并再次返回的唯一方法是通过在xml中使用类型提示。 默认转换器不会这样做。 1.在第一个属性之后删除所有内容2.从xml到json时,将单个元素列表与属性混淆
我已经使用json-util库重新实现了transconversion类,它将json转换为包含类型提示作为元素属性的xml,以确保没有歧义。
通过这种方式我们可以通过WSO2为所有基于json的rest服务提供智能代理(即内容路由并调解传输和有效负载),没有任何问题
这解决了这个问题(我认为骆驼默认这样做)。
这是pom文件和代码:
将jar放入/ repository / components / lib
您必须在axis2.xml中更新内容类型“application / json”的messageformatter和messagebuilder映射
4.0.0 wso2 json/xml converter xyz wso2converter 1.0.0-SNAPSHOT jar 1.6 wso2converter false src/main/resources org.apache.maven.plugins maven-compiler-plugin ${jdk.version} ${jdk.version} org.apache.maven.plugins maven-enforcer-plugin 1.0.1 enforce-jdk validate display-info enforce [${jdk.version},) net.sf.json-lib json-lib 2.3 jdk15 org.apache.commons commons-io 1.3.2 jar compile org.apache.ws.commons.axiom axiom-api 1.2.13 org.apache.axis2 axis2-kernel 1.6.2 xom xom 1.1 org.apache.synapse synapse-core 2.1.0 com.sun.jersey jersey-json 1.1.5 junit junit 4.8.2 log4j log4j 1.2.13
我有同样的问题。
根据我的经验,WSO2 ESB的JSON解析器(基于Axis2-json)仅支持JSON的一个子集:
-
JSON必须以“{”开头,即根目录下不能有JSONArray。
-
仅考虑第一个键值对。 这是因为JSON映射到类似XML的数据结构,并且XML必须具有根,因此第一个键值对被视为root。
-
第一个键值对的值不能是数组。 这是因为转换器必须知道每个值应该使用哪个XML标记:
例如:… {“key”:[“val1”,“val2”,…]} – > val1 key> val2 key> ….
我在这里有同样的问题,想找到一个解决方案。 我的想法是创建一个新的JSONBuilder(构建内部SOAP消息构造的解析器)和JSONFormatter(序列化器)来使用虚拟根(例如{“ root ”:…})伪造解析器。
- 如何让这个定时器服务类处理“预定时间的变化”?
- 如何对包含数字的String集合进行排序?
- 解决错误java.lang.NoSuchMethodError:org.codehaus.groovy.ast.ModuleNode.getStarImports()Ljava / util / List;
- 如何在java中创建任意深度的嵌套数组?
- jUnit忽略基类中的@Test方法
- ColorPane – 可以抓住不同角色的字符串?
- Jar文件ADD DIRECTORY ENTRIES导出jar时的Eclipse选项
- 适用于Java的Bitconverter
- ClassCastException $ Proxy无法使用aop强制转换为