我从我的数据库中转储了一些XML数据,我需要将其重新格式化为JSON。我正在使用IBM DataPower数据库,所以我实际上需要将该XML转换为JSONx,然后使用IBM的默认转换器,它会自动将JSONx转换为JSON。
我很难定义JSONx数组的元素。以下是我目前正在尝试的内容:
<sql result="success">
<row>
<column>
<name>Prod</name>
<value>Acura</value>
</column>
<column>
<name>Color</name>
<value>SILVER</value>
</column>
<column>
<name>Prod</name>
<value>Accord</value>
</column>
<column>
<name>Color</name>
<value>Gold</value>
</column>
</row>
</sql>
{"Category" : [
{“prod”: “Acura”, "Color" : “Silver”},
{“prod”: “Accord”, "Color" : “Gold”}
],
"Status" : “Success”
}
我遇到的问题是我不能让prod
和color
成为同一个JSON对象的一部分。相反,我得到这样的输出:
{"Category": [{
"ID": [
": Acura",
": Accord"
],
"NAME": [
": SILVER",
": Gold"
]
}]}
这是我正在使用的JSONx代码产生有问题的JSON:
<json:object
xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
<json:array name="Category">
<json:object>
<xsl:for-each select="//column">
<xsl:variable name="colName" select="name" />
<xsl:if test="$colName = 'Prod'">
<json:string name="Prod">:
<xsl:value-of select="value" />
</json:string>
</xsl:if>
<xsl:if test="$colName = 'Color'">
<json:string name="Color">:
<xsl:value-of select="value" />
</json:string>
</xsl:if>
</xsl:for-each>
</json:object>
</json:array>
</json:object>
我可以告诉<xsl:for-each>
标记正在经历一个条件并在循环中创建一个JSON对象,但是我不明白如何在之后创建JSON对象 color
和prod
的值。如何确保正确解析这些值?
答案 0 :(得分:2)
嗨我得到了答案,我尝试了多种可能性,这是其中一个可能性,我会得到像我在那个问题中提到的输出
<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
<json:array name="Categories">
<xsl:for-each select="sql/row">
<json:object>
<xsl:for-each select="column">
<xsl:variable name="colName" select="name" />
<xsl:choose>
<xsl:when test="$colName = 'PROD ">
<json:string name="name"> <xsl:value-of select="value"/></json:string>
</xsl:when>
<xsl:when test="$colName = 'NAME'">
<json:string name="ID"> <xsl:value-of select="value"/></json:string>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</json:object>
</xsl:for-each>
</json:array>
</json:object>
输出
{"Categories": [
{
"prod": "Acura",
"color": "SILVER"
},
{
"prod": "Accord",
"color": "Gold"
}
]}
答案 1 :(得分:0)
你必须在database to xml
解析上做更多工作,才能得到像这样的xml:
<product-list>
<product>
<name>Acura</name>
<color>SILVER</color>
</product>
<product>
<name>Accord</name>
<color>Gold</color>
</product>
</product-list>
这种方式可以更好地解析它。
你展示的xml,也许有可能做到这一点,但它会让你陷入不合理的复杂性......我想
编辑:我的编程环境还没有为这样的事情做好准备......所以请告诉我结果
<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
<json:array name="Category">
<xsl:for-each select="product">
<json:object>
<json:string name="prod"><xsl:value-of select="name"/></json:string>
<json:string name="Color"><xsl:value-of select="color"/></json:string>
</json:object>
<xsl:for-each>
<json:array>
</json:object>
或者这样
<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
<json:array name="Category">
<xsl:for-each select="product">
<xsl:text>{<xsl:text>
<json:string name="prod"><xsl:value-of select="name"/></json:string>
<json:string name="Color"><xsl:value-of select="color"/></json:string>
<xsl:text>}<xsl:text>
<xsl:for-each>
<json:array>
</json:object>
我认为第一个很好......如果对象需要名称,请选择最后一个。