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)转换。 JSONStreamBuilderJSONStreamFormatter可用于使用’script’介体实现此类场景。 看看ESB 4.5.0中的示例#441。

运行样本#441;

  • 在repository / conf / axis2 / axis2.xml文件中添加JSONStreamBuilderJSONStreamFormatter作为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的一个子集:

  1. JSON必须以“{”开头,即根目录下不能有JSONArray。

  2. 仅考虑第一个键值对。 这是因为JSON映射到类似XML的数据结构,并且XML必须具有根,因此第一个键值对被视为root。

  3. 第一个键值对的值不能是数组。 这是因为转换器必须知道每个值应该使用哪个XML标记:

    例如:… {“key”:[“val1”,“val2”,…]} – > val1 val2 ….

我在这里有同样的问题,想找到一个解决方案。 我的想法是创建一个新的JSONBuilder(构建内部SOAP消息构造的解析器)和JSONFormatter(序列化器)来使用虚拟根(例如{“ root ”:…})伪造解析器。