XML怎么转换JSON?安卓开发实用指南
在安卓开发中,XML和JSON是两种常见的数据交换格式,XML常用于配置文件、网络响应(如SOAP服务)或本地数据存储,而JSON因轻量级、解析高效更受移动端青睐,当需要将XML格式数据转换为JSON时(例如对接API、统一数据格式处理),转换方法至关重要,本文将详细介绍安卓环境下XML转JSON的多种实现方式,从原生代码到第三方库,助你轻松应对不同场景。
XML转JSON的核心思路
XML(可扩展标记语言)和JSON(JavaScript对象表示法)都是结构化数据格式,但结构差异明显:XML通过标签嵌套表示层级(如<user><name>张三</name></user>),JSON通过键值对和数组表示(如{"user":{"name":"张三"}}),转换的核心逻辑是:将XML的标签层级映射为JSON的对象嵌套,标签属性映射为JSON对象的键值对,标签文本内容映射为对象的值。
安卓原生实现:XmlToJson(无需第三方库)
安卓系统提供了org.xmlpull.v1.XmlPullParser和org.json包,无需额外依赖即可实现XML转JSON,以下是分步实现:
添加网络权限(如需解析网络XML)
在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" />
编写转换工具类
import org.json.JSONArray;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class XmlToJsonConverter {
/**
* XML字符串转JSON对象
* @param xmlStr XML字符串
* @return JSONObject
* @throws Exception 解析异常
*/
public static JSONObject convertXmlToJson(String xmlStr) throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlStr));
JSONObject jsonResult = new JSONObject();
parseXml(parser, jsonResult);
return jsonResult;
}
private static void parseXml(XmlPullParser parser, JSONObject json) throws Exception {
int eventType = parser.getEventType();
String currentTag = null;
JSONObject currentJson = null;
JSONArray currentArray = null;
List<JSONObject> arrayItems = new ArrayList<>();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if (json.has(tagName)) {
// 标签重复,转为数组
Object existing = json.get(tagName);
if (existing instanceof JSONObject) {
arrayItems.add((JSONObject) existing);
arrayItems.add(new JSONObject());
} else if (existing instanceof JSONArray) {
arrayItems.addAll(((JSONArray) existing).toList());
}
currentArray = new JSONArray(arrayItems);
json.put(tagName, currentArray);
} else {
currentJson = new JSONObject();
// 解析属性
for (int i = 0; i < parser.getAttributeCount(); i++) {
currentJson.put("@" + parser.getAttributeName(i), parser.getAttributeValue(i));
}
json.put(tagName, currentJson);
}
currentTag = tagName;
break;
case XmlPullParser.TEXT:
String text = parser.getText().trim();
if (!text.isEmpty() && currentJson != null) {
currentJson.put("text", text);
}
break;
case XmlPullParser.END_TAG:
if (currentJson != null && currentTag != null) {
Object value = json.get(currentTag);
if (value instanceof JSONObject && ((JSONObject) value).length() == 0) {
json.put(currentTag, "");
}
}
currentTag = null;
currentJson = null;
break;
}
eventType = parser.next();
}
}
}
使用示例
// 示例XML字符串
String xmlData = "<user id=\"1\">" +
"<name>张三</name>" +
"<age>25</age>" +
"<hobbies><hobby>阅读</hobby><hobby>编程</hobby></hobbies>" +
"</user>";
try {
JSONObject jsonData = XmlToJsonConverter.convertXmlToJson(xmlData);
Log.d("XML转JSON", jsonData.toString());
// 输出:{"user":{"@id":"1","name":{"text":"张三"},"age":{"text":"25"},"hobbies":{"hobby":[{"text":"阅读"},{"text":"编程"}]}}}
} catch (Exception e) {
e.printStackTrace();
}
优缺点分析
- 优点:无需依赖第三方库,减少APK体积。
- 缺点:代码较复杂,需手动处理XML嵌套、属性、数组等场景,容错性较弱。
第三方库推荐:Simple XML + Gson(高效便捷)
原生实现代码量较大,推荐使用Simple XML(解析XML)和Gson(转JSON)组合,简化开发流程。
添加依赖
在app/build.gradle中添加:
// Simple XML(解析XML为Java对象) implementation 'org.simpleframework:simple-xml:2.7.1' // Gson(Java对象转JSON) implementation 'com.google.code.gson:gson:2.10.1' // Simple XML依赖的注解处理器(可选,避免编译警告) annotationProcessor 'org.simpleframework:simple-xml:2.7.1'
定义XML对应的Java实体类
使用Simple XML的注解映射XML结构:
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.util.List;
@Root(name = "user")
public class User {
@Attribute(name = "id")
private int id;
@Element(name = "name")
private String name;
@Element(name = "age")
private int age;
@ElementList(entry = "hobby", inline = true)
private List<String> hobbies;
// 必须提供无参构造方法
public User() {}
// Getter和Setter
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public List<String> getHobbies() { return hobbies; }
public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
}
实现XML转JSON
import com.google.gson.Gson;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
public class XmlToJsonConverterWithLib {
/**
* XML转JSON(通过Java对象中转)
* @param xmlStr XML字符串
* @return JSON字符串
*/
public static String convertXmlToJson(String xmlStr) throws Exception {
// 1. Simple XML解析XML为Java对象
Serializer serializer = new Persister();
User user = serializer.read(User.class, xmlStr);
// 2. Gson转JSON
Gson gson = new Gson();
return gson.toJson(user);
}
}
使用示例
String xmlData = "<user id=\"1\">" +
"<name>张三</name>" +
"<age>25</age>" +
"<hobbies><hobby>阅读</hobby><hobby>编程</hobby></hobbies>" +
"</user>";
try {
String jsonData = XmlToJsonConverterWithLib.convertXmlToJson(xmlData);
Log.d("XML转JSON", jsonData);
// 输出:{"id":1,"name":"张三","age":25,"hobbies":["阅读","编程"]}
} catch (Exception e) {
e.printStackTrace();
}
优缺点分析
- 优点:代码简洁,通过注解自动映射XML结构,Gson高效转JSON,适合复杂XML场景。
- 缺点:需引入第三方库,增加APK体积(约50KB-100KB)。
网络XML数据转换:结合OkHttp + Retrofit
若XML数据来自网络(如API响应),可结合OkHttp和Retrofit实现流式转换。
添加依赖
implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-simplexml:2.9.0'
定义Retrofit接口
import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; import retrofit2.Call; import retrofit



还没有评论,来说两句吧...