在Android中将XML转换为JSON对象

25

我有一个如下所示的XML字符串:

<s:Envelope 
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><Response 
xmlns="http://tempuri.org/"><UserResult><Users xmlns=""><User>
<Message>Success</Message>
<UserId>213213213</UserId>
<FullName>Abc</FullName>
<Roles>
<Role>
<RoleId>23232333</RoleId>
<RoleName>Salesperson</RoleName>
</Role>
</Roles>
</User>
</Users>
</UserResult></Response>
</s:Body>
</s:Envelope>

可以将XML转换为JSON吗?


您可以使用在线工具 https://javadev.github.io/xml-to-json/ 进行XML转JSON。 - Valentyn Kolesnikov
5个回答

76
你也可以尝试这种方式。我已经亲自尝试和测试过了。
步骤1:请下载 java-json.jar
步骤2:将其添加到项目的 /libs 文件夹中,然后将其添加到构建路径中。
步骤3:然后按以下方式使用它:
  • 要查找的导入

import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;
  • 示例字符串

  • String sampleXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
        + "<mobilegate>"    
    +"<timestamp>232423423423</timestamp>"                          
    + "<txn>" + "Transaction" + "</txn>" 
    + "<amt>" + 0 + "</amt>" 
    + "</mobilegate>"; 
    
  • JSON字符串

    JSONObject jsonObj = null;
    try {
        jsonObj = XML.toJSONObject(sampleXml);
    } catch (JSONException e) {
        Log.e("JSON exception", e.getMessage());
        e.printStackTrace();
    } 
    
    Log.d("XML", sampleXml);
    
    Log.d("JSON", jsonObj.toString());
    
  • 输出:

    XML:

    <?xml version="1.0" encoding="utf-8"?><mobilegate><timestamp>232423423423</timestamp><txn>Transaction</txn><amt>0</amt></mobilegate>

    JSON :

    {"mobilegate":{"timestamp":232423423423,"amt":0,"txn":"Transaction"}}


    1
    @RiteshGune 如果XML包含<![CDATA[ 26 ]]>,应用程序会崩溃。有没有解决方案?我在这里找到了一个类似的问题 - http://stackoverflow.com/questions/29283261/converting-xml-to-json-android - Kiran K
    将xml转换为json是一个好的实践吗?我的意思是,我更喜欢json,但只是想知道这样做是否可以。这样做可能会在您的Android应用程序中出现潜在问题吗?(例如,也许xml数据以某种方式发生变化,使得json毫无意义) - Micro
    在我看来,无论是不是一种好的实践都是一个不同的问题。使用XML或JSON各有其优缺点,但是可能有一些情况需要将XML转换为JSON。因此,选择必须基于需求,以便不必进行转换。 - Ritesh Gune
    @AbdulWahab:请帮忙,当你遇到这个XML未找到的错误时,你使用了哪个库?我也遇到了同样的问题。 - Chander Shakher Ghorela - Guru
    5
    @ChanderShakherGhorela-Guru 我也遇到了同样的问题。我在我的 build.gradle 文件中添加了 compile files('libs/java-json.jar'),同步项目后错误信息消失了。 - Panagiotis Nto
    显示剩余6条评论

    11

    我刚刚发布了一个面向Android Studio的“XML to JSON”库。

    它很容易与Gradle集成,使用简单且可配置。

    XmlToJson可以在GitHub上获取:

    https://github.com/smart-fun/XmlToJson

    享受吧!


    很适合我。更重要的是,非常容易编辑以使用“json-smart”库,而不是令人发指的“org.json”实现。我无法忍受 JSONException - aroth
    嘿,我看了你的方案。很不错。一些值,比如 "'issn': '00368733' -> 在你的解决方案中表现为 ""issn": 368733," 。前面带有零的数字被省略了。只是提供给你的信息,兄弟。 - charitha amarasinghe
    而且列表值也会用{}括号分隔。 - charitha amarasinghe
    亲爱的朋友,无法实现库。 这是我在APP build.gradle文件中添加的内容:implementation 'com.github.smart-fun:XmlToJson:1.4.5'出现以下错误: ERROR: 无法解析:com.github.smart-fun:XmlToJson:1.4.5 - Petros Mosoyan
    Petros,你可能忘记在项目的build.gradle文件中添加jitpack信息了吧?maven { url "https://jitpack.io" } - Arnaud SmartFun
    我选择了这个库,因为它非常容易解析一个有310k行的xml字符串,而Underscore Java端口库则需要5分钟 >.< - Starwave

    2

    Underscore-java有一个静态方法U.xmlToJson(xml)实时例子

    import com.github.underscore.U;
    
    public class Main {
        public static void main(String[] args) {
            String xml = "<s:Envelope \n"
                        + "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><Response \n"
                        + "xmlns=\"http://tempuri.org/\"><UserResult><Users xmlns=\"\"><User>\n"
                        + "<Message>Success</Message>\n"
                        + "<UserId>213213213</UserId>\n"
                        + "<FullName>Abc</FullName>\n"
                        + "<Roles>\n"
                        + "<Role>\n"
                        + "<RoleId>23232333</RoleId>\n"
                        + "<RoleName>Salesperson</RoleName>\n"
                        + "</Role>\n"
                        + "</Roles>\n"
                        + "</User>\n"
                        + "</Users>\n"
                        + "</UserResult></Response>\n"
                        + "</s:Body>\n"
                        + "</s:Envelope>";
            System.out.println(U.xmlToJson(xml));
        }
    }
    

    输出:

    {
      "s:Envelope": {
        "-xmlns:s": "http://schemas.xmlsoap.org/soap/envelope/",
        "s:Body": {
          "Response": {
            "-xmlns": "http://tempuri.org/",
            "UserResult": {
              "Users": {
                "-xmlns": "",
                "User": {
                  "Message": "Success",
                  "UserId": "213213213",
                  "FullName": "Abc",
                  "Roles": {
                    "Role": {
                      "RoleId": "23232333",
                      "RoleName": "Salesperson"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "#omit-xml-declaration": "yes"
    }
    

    尝试使用良好的XML字符串,但出现以下错误javax.xml.parsers.ParserConfigurationException: http://apache.org/xml/features/nonvalidating/load-external-dtd。不幸的是,链接已经失效了,因此无法获得帮助。 - Jacko

    2
    我建议您使用json-lib,这是一个为任何Java程序添加JSON支持的库。json-lib可以将XML转换为JSON对象。
    您可以从这里获取json-lib。
    例如:
    String xml = "your xml string";                
    XMLSerializer xmlSerializer = new XMLSerializer(); 
    JSON json = xmlSerializer.read( xml );
    

    我曾尝试使用JSON库,但是却遇到了NoSuchMethodError异常。 - sharry
    请粘贴logcat。 - Ritesh Gune
    1
    由于:java.lang.verifyError: net/sf/json/xml/XMLSerializer - sharry
    你是否将该jar包添加到构建路径中了? - Ritesh Gune
    使用这个Jar包时,会出现以下错误..02-04 15:43:52.874: E/AndroidRuntime(10269): java.lang.VerifyError: net/sf/json/xml/XMLSerializer - harikrishnan

    0

    你可以将xml转换为jackson对象,然后使用jackson json。

    我尝试将XmlPull支持添加到jackson xml中。在此处找到分叉的项目:

    https://github.com/finvu/jackson-dataformat-xml

    目前,仅支持版本2.9.6。(克隆分支jackson-dataformat-xml-2.9.6-XmlPull)

    很抱歉,由于时间限制,我无法提供详细的文档。如果您了解git和maven以拉取特定分支并构建jar,则应该相对容易。

    Jackson xml文档可以在此处找到jackson xml git主页:

    https://github.com/finvu/jackson-dataformat-xml/tree/jackson-dataformat-xml-2.9.6-XmlPull


    Underscore-java 更好地将 XML 转换为 JSON。具有实时示例、MIT 许可证和一个静态方法。 - Valentyn Kolesnikov

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接