将 Json 转换为 Xml 的最简单方法

     2023-02-26     256

关键词:

【中文标题】将 Json 转换为 Xml 的最简单方法【英文标题】:Simplest method to Convert Json to Xml 【发布时间】:2011-10-08 05:36:43 【问题描述】:

我在 .net 中有网络服务。当我从数据库中检索数据时,它会在 Android Mobile 中返回 JSON 文件。如何将 JSON 文件转换为 XML 或文本。

【问题讨论】:

也许你应该在你的 UI 上阅读 JavaScript 中的 JSON 并解析它。 (并相应地显示)。如果你必须看到here 查看this 和this 希望这会对您有所帮助。 Underscore-java库有一个静态方法U.jsonToXml(json)。 【参考方案1】:

对于一个简单的解决方案,我推荐Jackson,因为它可以通过几行简单的代码将任意复杂的 JSON 转换为 XML。

import org.codehaus.jackson.map.ObjectMapper;

import com.fasterxml.jackson.xml.XmlMapper;

public class Foo

  public String name;
  public Bar bar;

  public static void main(String[] args) throws Exception
  
    // JSON input: "name":"FOO","bar":"id":42
    String jsonInput = "\"name\":\"FOO\",\"bar\":\"id\":42";

    ObjectMapper jsonMapper = new ObjectMapper();
    Foo foo = jsonMapper.readValue(jsonInput, Foo.class);

    XmlMapper xmlMapper = new XmlMapper();
    System.out.println(xmlMapper.writeValueAsString(foo));
    // <Foo xmlns=""><name>FOO</name><bar><id>42</id></bar></Foo>
  


class Bar

  public int id;

此演示使用Jackson 1.7.7(较新的 1.7.8 也应该可以使用)、Jackson XML Databind 0.5.3(尚不兼容 Jackson 1.8)和 Stax2 3.1.1。

【讨论】:

如果我没有/不想要Foo 或任何课程怎么办?有通用的方法吗? 我相信你可以使用 Map 注意XmlMapper包在以后的版本(如2.1.1)中,是com.fasterxml.jackson.dataformat.xml.XmlMapper。【参考方案2】:

这是一个示例,说明如何执行此操作,生成有效的 XML。我还在一个 Maven 项目中使用 Jackson 库。

Maven 设置:

<!-- https://mvnrepository.com/artifact/com.fasterxml/jackson-xml-databind -->
    <dependency>
        <groupId>com.fasterxml</groupId>
        <artifactId>jackson-xml-databind</artifactId>
        <version>0.6.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.6</version>
    </dependency>

这是一些 Java 代码,它首先将 JSON 字符串转换为对象,然后使用 XMLMapper 将对象转换为 XML,并删除任何错误的元素名称。在 XML 元素名称中替换错误字符的原因是您可以在 JSON 元素名称中使用 $oid 等 XML 中不允许的字符。 Jackson 库没有考虑到这一点,所以我最终添加了一些代码,这些代码从元素名称和命名空间声明中删除了非法字符。

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.xml.XmlMapper;

import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Converts JSON to XML and makes sure the resulting XML 
 * does not have invalid element names.
 */
public class JsonToXMLConverter 

    private static final Pattern XML_TAG =
            Pattern.compile("(?m)(?s)(?i)(?<first><(/)?)(?<nonXml>.+?)(?<last>(/)?>)");

    private static final Pattern REMOVE_ILLEGAL_CHARS = 
            Pattern.compile("(i?)([^\\s=\"'a-zA-Z0-9._-])|(xmlns=\"[^\"]*\")");

    private ObjectMapper mapper = new ObjectMapper();

    private XmlMapper xmlMapper = new XmlMapper();

    String convertToXml(Object obj) throws IOException 
        final String s = xmlMapper.writeValueAsString(obj);
        return removeIllegalXmlChars(s);
    

    private String removeIllegalXmlChars(String s) 
        final Matcher matcher = XML_TAG.matcher(s);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()) 
            String elementName = REMOVE_ILLEGAL_CHARS.matcher(matcher.group("nonXml"))
                    .replaceAll("").trim();
            matcher.appendReplacement(sb, "$first" + elementName + "$last");
        
        matcher.appendTail(sb);
        return sb.toString();
    

    Map<String, Object> convertJson(String json) throws IOException 
        return mapper.readValue(json, new TypeReference<Map<String, Object>>());
    

    public String convertJsonToXml(String json) throws IOException 
        return convertToXml(convertJson(json));
    

这是 convertJsonToXml 的 JUnit 测试:

@Test
void convertJsonToXml() throws IOException, ParserConfigurationException, SAXException 
    try(InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("json/customer_sample.json")) 
        String json = new Scanner(in).useDelimiter("\\Z").next();
        String xml = converter.convertJsonToXml(json);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
        Node first = doc.getFirstChild();
        assertNotNull(first);
        assertTrue(first.getChildNodes().getLength() > 0);
    

【讨论】:

这是一个不错且有用的答案,但如果我们可以摆脱 XML 输出中的 或类似的 XML 包装器,那就更好了。实际上,我们需要的是 JSON 到 XML 的精确转换。【参考方案3】:

android 中没有直接转换 API 可用于将 JSON 转换为 XML。您需要先解析 JSON,然后您必须编写将其转换为 xml 的逻辑。

【讨论】:

【参考方案4】:

标准org.json.XML 类在 JSON 和 XML 之间双向转换。还有tutorial如何使用。

转换不是很好,因为它根本不创建 XML 属性(仅实体),因此 XML 输出比可能的要庞大。但它不需要定义与需要转换的数据结构相匹配的Java类。

【讨论】:

生成无效的 XML。 修复链接并添加教程【参考方案5】:

Underscore-java 库有静态方法 U.jsonToXml(string)。 Live example

import com.github.underscore.U;

public class MyClass 
    public static void main(String args[]) 
        String json = "\"Price\": "
        + "    \"LineItems\": "
        + "        \"LineItem\": "
        + "            \"UnitOfMeasure\": \"EACH\", \"Quantity\": 2, \"ItemID\": \"ItemID\""
        + "        "
        + "    ,"
        + "    \"Currency\": \"USD\","
        + "    \"EnterpriseCode\": \"EnterpriseCode\""
        + "";
        System.out.println(U.jsonToXml(json)); 
    

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Price>
  <LineItems>
    <LineItem>
      <UnitOfMeasure>EACH</UnitOfMeasure>
      <Quantity number="true">2</Quantity>
      <ItemID>ItemID</ItemID>
    </LineItem>
  </LineItems>
  <Currency>USD</Currency>
  <EnterpriseCode>EnterpriseCode</EnterpriseCode>
</Price>

【讨论】:

将 pcap 转换为 JSON 的最简单方法

】将pcap转换为JSON的最简单方法【英文标题】:EasiestwaytoconvertpcaptoJSON【发布时间】:2012-09-0202:15:36【问题描述】:我有一堆用tcpdump创建的pcap文件。我想将它们存储在数据库中,以便于查询、索引等。我认为mongodb可能是一个不... 查看详情

将带有表格数据的 Excel 电子表格转换为 JSON 的最简单方法是啥? [关闭]

】将带有表格数据的Excel电子表格转换为JSON的最简单方法是啥?[关闭]【英文标题】:WhatistheeasiestwaytoconvertanExcelspreadsheetwithtabulardatatoJSON?[closed]将带有表格数据的Excel电子表格转换为JSON的最简单方法是什么?[关闭]【发布时间】... 查看详情

Mule:有没有将 XML 转换为 JSON 的简单方法

】Mule:有没有将XML转换为JSON的简单方法【英文标题】:Mule:IstheresimplewayofconvertingXMLtoJSON【发布时间】:2014-01-1010:22:06【问题描述】:有没有将XML转换为JSON的简单方法,而无需先将XML绑定到java对象?就像这样——http://www.utilities... 查看详情

将 freemarker 对象呈现为 JSON 的最简单方法是啥?

】将freemarker对象呈现为JSON的最简单方法是啥?【英文标题】:WhatistheeasiestwaytorenderafreemarkerobjectasJSON?将freemarker对象呈现为JSON的最简单方法是什么?【发布时间】:2016-02-2116:06:10【问题描述】:我在freemarker中有一个数据结构,... 查看详情

在数据流 2.x 中将 TableRow 转换为 JSON 格式字符串的最简单方法?

】在数据流2.x中将TableRow转换为JSON格式字符串的最简单方法?【英文标题】:EasiestwaytoconvertaTableRowtoJSON-formattedString,indataflow2.x?【发布时间】:2018-06-1214:40:41【问题描述】:没有编写自己的函数来完成它,将数据流2.x管道内的Tabl... 查看详情

将数组转换为向量的最简单方法是啥?

】将数组转换为向量的最简单方法是啥?【英文标题】:Whatisthesimplestwaytoconvertarraytovector?将数组转换为向量的最简单方法是什么?【发布时间】:2012-01-0812:44:48【问题描述】:将数组转换为向量的最简单方法是什么?voidtest(vecto... 查看详情

将数组转换为向量的最简单方法是啥?

】将数组转换为向量的最简单方法是啥?【英文标题】:Whatisthesimplestwaytoconvertarraytovector?将数组转换为向量的最简单方法是什么?【发布时间】:2012-01-0812:44:48【问题描述】:将数组转换为向量的最简单方法是什么?voidtest(vecto... 查看详情

将字符串转换为流的最简单方法是啥?

】将字符串转换为流的最简单方法是啥?【英文标题】:Whatisthesimplestwaytoconvertastringtoastream?将字符串转换为流的最简单方法是什么?【发布时间】:2012-01-0722:42:15【问题描述】:今天我用的是内存流:newMemoryStream(Encoding.UTF8.GetBy... 查看详情

将 ndarray 转换为 cv::Mat 的最简单方法是啥?

】将ndarray转换为cv::Mat的最简单方法是啥?【英文标题】:Whatistheeasiestwaytoconvertndarrayintocv::Mat?将ndarray转换为cv::Mat的最简单方法是什么?【发布时间】:2014-05-0907:37:12【问题描述】:我正在尝试为使用来自OpenCV的cv::Mat类的C++库... 查看详情

将概率转换为预测标签的最简单和最快的方法是啥? [关闭]

】将概率转换为预测标签的最简单和最快的方法是啥?[关闭]【英文标题】:Whatistheeasiestandfastestwayofconvertingprobabilitiesintopredictionlabels?[closed]将概率转换为预测标签的最简单和最快的方法是什么?[关闭]【发布时间】:2018-05-2206:57... 查看详情

将 URL 转换为 C# 字符串中的超链接的最简单方法?

】将URL转换为C#字符串中的超链接的最简单方法?【英文标题】:EasiestwaytoconvertaURLtoahyperlinkinaC#string?【发布时间】:2010-09-0703:40:57【问题描述】:我正在使用TwitterAPI并希望将所有URL转换为超链接。您想出的最有效的方法是什么... 查看详情

将mat3转换为mat4的最简单方法

】将mat3转换为mat4的最简单方法【英文标题】:Simplestwaytoconvertmat3tomat4【发布时间】:2017-11-1014:47:17【问题描述】:我提取了mat4的左上角3x3旋转矩阵:glm::mat4model;glm::mat3rot=glm::mat3(model);现在我想要左上角的单位矩阵是我的新mat3... 查看详情

在 Java 中将 List 转换为 Set 的最简单方法

】在Java中将List转换为Set的最简单方法【英文标题】:EasiestwaytoconvertaListtoaSetinJava【发布时间】:2010-11-2815:04:54【问题描述】:在Java中将List转换为Set的最简单方法是什么?【问题讨论】:【参考方案1】:在Java1.8中,流API可用于... 查看详情

在 ASP.net 中将 BMP 转换为 PDF 的最简单方法是啥

】在ASP.net中将BMP转换为PDF的最简单方法是啥【英文标题】:What\'stheeasiestwaytoconvertaBMPtoaPDFinASP.net在ASP.net中将BMP转换为PDF的最简单方法是什么【发布时间】:2010-08-2516:46:21【问题描述】:使用ASP.net将BMP文件转换为单页PDF的最简单... 查看详情

在 python 中将列表转换为 HTML 表格的最简单方法?

】在python中将列表转换为HTML表格的最简单方法?【英文标题】:EasiestwaytoturnalistintoanHTMLtableinpython?【发布时间】:2010-12-0107:12:15【问题描述】:假设我有一个这样的列表:[\'one\',\'two\',\'three\',\'four\',\'five\',\'six\',\'seven\',\'eight\',\... 查看详情

将 Java 字符串从全部大写(由下划线分隔的单词)转换为 CamelCase(无单词分隔符)的最简单方法是啥?

】将Java字符串从全部大写(由下划线分隔的单词)转换为CamelCase(无单词分隔符)的最简单方法是啥?【英文标题】:WhatisthesimplestwaytoconvertaJavastringfromallcaps(wordsseparatedbyunderscores)toCamelCase(nowordseparators)?将Java字符串从全部大写... 查看详情

将 XML 转换为 JSON 格式

】将XML转换为JSON格式【英文标题】:ConvertXMLtoJSONformat【发布时间】:2011-07-0401:52:14【问题描述】:我必须将docx文件格式(openXML格式)转换为JSON格式。我需要一些指导方针来做到这一点。提前致谢。【问题讨论】:考虑使用simp... 查看详情

将 Data.ByteString.Lazy 转换为 CStringLen 的最有效方法

】将Data.ByteString.Lazy转换为CStringLen的最有效方法【英文标题】:MostefficientwayofconvertingaData.ByteString.LazytoaCStringLen【发布时间】:2020-02-1506:26:37【问题描述】:我需要将一些数据编码为JSON,然后使用hsyslog推送到syslog。两个相关函... 查看详情