xml与json互相转换



import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;

import java.util.List;
import java.util.Set;

/**
 * @author
 */
public class XmlConvert {
    /**
     * 属性名前缀
     */
    private String attributeNamePrefix;
    /**
     * 文本键名称
     */
    private String textKey;
    /**
     * 移除xml头文件,<?xml version="1.0" encoding="UTF-8"?>
     */
    private boolean removeHeader;

    public XmlConvert() {
        this.setAttributeNamePrefix("@");
        this.setTextKey("#text");
        this.setRemoveHeader(true);
    }

    public XmlConvert(String attributeNamePrefix, String textKey) {
        this(attributeNamePrefix, textKey, true);
    }

    public XmlConvert(String attributeNamePrefix, String textKey, boolean removeHeader) {
        this.attributeNamePrefix = attributeNamePrefix;
        this.textKey = textKey;
        this.removeHeader = removeHeader;
    }

    /**
     * json转xml<br/>
     * {"abc":["aa","bb"]},此种格式的json串不支持,无根节点; 格式应该为:{"root":{"abc":["aa","bb"]}}
     *
     * @param json
     * @return
     */
    public String jsonToXml(String json) {
        JSONObject jsonObject = JSON.parseObject(json);
        Set<String> keySet = jsonObject.keySet();
        if (!keySet.isEmpty() && keySet.size() == 1) {
            // 将第一个节点name,作为根节点
            String rootName = keySet.iterator().next();
            Element rootElement = DocumentHelper.createElement(rootName);
            Element element = processObject(jsonObject.get(rootName), rootElement);
            String xml = DocumentHelper.createDocument(element).asXML();
            if (isRemoveHeader()) {
                xml = removeHeader(xml);
            }
            return xml;
        } else {
            throw new RuntimeException("The json text is not formatted correctly");
        }
    }

    private Element processObject(Object object, Element element) {
        if (object instanceof JSONObject) {
            return processJSONObject((JSONObject) object, element);
        } else if (object instanceof JSONArray) {
            return processJSONArray((JSONArray) object, element, element.getName());
        } else {
            return processText(object.toString(), element);
        }
    }

    private static Element processText(String text, Element element) {
        element.setText(text);
        return element;
    }

    private Element processJSONObject(JSONObject jsonObject, Element element) {
        jsonObject.forEach((key, value) -> {
            if (key.startsWith(getAttributeNamePrefix())) {
                element.addAttribute(key.substring(getPrefixLength()), value.toString());
            } else if (key.equals(getTextKey())) {
                element.setText(value.toString());
            } else {
                processValue(element, key, value);
            }
        });
        return element;
    }

    private void processValue(Element element, String name, Object value) {
        if (value instanceof JSONObject) {
            Element tempElement = processJSONObject((JSONObject) value, DocumentHelper.createElement(name));
            element.add(tempElement);
        } else if (value instanceof JSONArray) {
            JSONArray jsonArray = (JSONArray) value;
            int size = jsonArray.size();
            for (int i = 0; i < size; i++) {
                processValue(element, name, jsonArray.get(i));
            }
        } else {
            Element temp = processText(value.toString(), DocumentHelper.createElement(name));
            element.add(temp);
        }
    }

    private Element processJSONArray(JSONArray jsonArray, Element root, String name) {
        int size = jsonArray.size();
        for (int i = 0; i < size; ++i) {
            processValue(root, name, jsonArray.get(i));
        }
        return root;
    }

    /**
     * xml转json
     *
     * @param xml
     * @return
     */
    public String xmlToJson(String xml) {
        try {
            Document document = DocumentHelper.parseText(xml);
            Element rootElement = document.getRootElement();
            JSON json = processObjectElement(rootElement);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put(rootElement.getName(), json);
            return jsonObject.toJSONString();
        } catch (DocumentException e) {
            throw new RuntimeException("The XML text is not formatted correctly", e);
        }
    }

    private JSONObject processObjectElement(Element element) {
        if (element == null) {
            return new JSONObject();
        }
        JSONObject jsonObject = new JSONObject();

        List<Attribute> attributes = element.attributes();
        for (Attribute attribute : attributes) {
            String attributeName = getAttributeNamePrefix() + attribute.getName();
            String attributeValue = attribute.getValue();
            setOrAccumulate(jsonObject, attributeName, attributeValue);
        }

        int nodeCount = element.nodeCount();
        for (int i = 0; i < nodeCount; i++) {
            Node node = element.node(i);
            if (node instanceof Text) {
                Text text = (Text) node;
                setOrAccumulate(jsonObject, getTextKey(), text.getText());
            } else if (node instanceof Element) {
                setValue(jsonObject, (Element) node);
            }
        }

        return jsonObject;
    }

    private void setValue(JSONObject jsonObject, Element element) {
        if (isObject(element)) {
            JSONObject elementJsonObj = processObjectElement(element);
            setOrAccumulate(jsonObject, element.getName(), elementJsonObj);
        } else {
            setOrAccumulate(jsonObject, element.getName(), element.getStringValue());
        }
    }

    private boolean isObject(Element element) {
        int attributeCount = element.attributeCount();
        if (attributeCount > 0) {
            return true;
        }

        int attrs = element.nodeCount();
        if (attrs == 1 && element.node(0) instanceof Text) {
            return false;
        } else {
            return true;
        }
    }

    private void setOrAccumulate(JSONObject jsonObject, String key, Object value) {
        if (jsonObject.containsKey(key)) {
            Object obj = jsonObject.get(key);
            if (obj instanceof JSONArray) {
                // 若为数组直接添加
                ((JSONArray) obj).add(value);
            } else {
                // 若为非数组,创建数组(已存在的值obj,待添加的值value)
                JSONArray jsonArray = new JSONArray();
                jsonArray.add(obj);
                jsonArray.add(value);
                jsonObject.put(key, jsonArray);
            }
        } else {
            jsonObject.put(key, value);
        }
    }

    /**
     * 移除xml报文头
     *
     * @param source
     * @return
     */
    private String removeHeader(String source) {
        return source.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "")
                .replaceAll("\r|\n", "");
    }


    public String getAttributeNamePrefix() {
        return attributeNamePrefix;
    }

    public void setAttributeNamePrefix(String attributeNamePrefix) {
        this.attributeNamePrefix = attributeNamePrefix;
    }

    public String getTextKey() {
        return textKey;
    }

    public void setTextKey(String textKey) {
        this.textKey = textKey;
    }

    public boolean isRemoveHeader() {
        return removeHeader;
    }

    public void setRemoveHeader(boolean removeHeader) {
        this.removeHeader = removeHeader;
    }

    private int getPrefixLength() {
        return this.attributeNamePrefix.length();
    }

}





import net.sf.json.JSON;
import net.sf.json.JSONSerializer;
import net.sf.json.xml.XMLSerializer;

/**
 * @author
 */
public class XmlJsonUtils {
    private XmlJsonUtils() {
    }

    /**
     * xml转json,默认忽略根节点
     *
     * @param xml
     * @return
     */
    @Deprecated
    public static String xmlToJsonStr(String xml) {
        return xmlToJsonStr(xml, false);
    }

    /**
     * xml转json
     *
     * @param xml
     * @param forceTopLevelObject 显示(解析)根节点
     * @return
     */
    @Deprecated
    public static String xmlToJsonStr(String xml, boolean forceTopLevelObject) {
        XMLSerializer xmlSerializer = new XMLSerializer();
        xmlSerializer.setForceTopLevelObject(forceTopLevelObject);
        return xmlSerializer.read(xml).toString();
    }

    /**
     * json转xml,默认根节点为o
     *
     * @param jsonStr
     * @return
     */
    @Deprecated
    public static String jsonToXml(String jsonStr) {
        return jsonToXml(jsonStr, "");
    }

    /**
     * json转xml
     *
     * @param jsonStr
     * @param rootName 可设置根节点
     * @return
     */
    @Deprecated
    public static String jsonToXml(String jsonStr, String rootName) {
        return jsonToXml(jsonStr, rootName, null);
    }

    /**
     * @param jsonStr
     * @param rootName
     * @param elementName
     * @return
     */
    @Deprecated
    public static String jsonToXml(String jsonStr, String rootName, String elementName) {
        XMLSerializer xmlSerializer = new XMLSerializer();
        // 关闭类型提示
        xmlSerializer.setTypeHintsEnabled(false);
        // 设置根节点名称
        xmlSerializer.setRootName(rootName);
        xmlSerializer.setElementName(elementName);
        JSON json = getJSON(jsonStr);
        String xmlStr = xmlSerializer.write(json);
        return removeHeaderMessage(xmlStr);
    }

    /**
     * 移除xml报文头
     *
     * @param source
     * @return
     */
    @Deprecated
    private static String removeHeaderMessage(String source) {
        return source.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "").replaceAll("\r|\n", "");
    }

    /**
     * json串转换为json对象
     *
     * @param jsonStr
     * @return
     */
    @Deprecated
    private static JSON getJSON(String jsonStr) {
        return JSONSerializer.toJSON(jsonStr);
    }

    // 新的xml与json互相转换

    /**
     * xml转json
     *
     * @param xml                 待转换的xml
     * @param attributeNamePrefix xml属性名前缀
     * @param textKey             xml文本键名称
     * @return
     */
    public static String xmlToJSON(String xml, String attributeNamePrefix, String textKey) {
        XmlConvert xmlConvert = new XmlConvert(attributeNamePrefix, textKey);
        return xmlConvert.xmlToJson(xml);
    }

    /**
     * xml转json<br/>
     * 默认xml文本键名称为:#text
     *
     * @param xml                 待转换的xml
     * @param attributeNamePrefix xml属性名前缀
     * @return
     */
    public static String xmlToJSON(String xml, String attributeNamePrefix) {
        return xmlToJSON(xml, attributeNamePrefix, "#text");
    }

    /**
     * xml转json<br/>
     * 默认xml文本键名称为:#text,xml属性名前缀为'@'
     *
     * @param xml 待转换的xml
     * @return
     */
    public static String xmlToJSON(String xml) {
        return xmlToJSON(xml, "@");
    }


    /**
     * json转xml
     *
     * @param json                待转换的json串
     * @param attributeNamePrefix 转换后的xml属性名前缀
     * @param textKey             转换后的xml文本键名称
     * @param removeHeader        移除xml头文件
     * @return
     */
    public static String jsonToXML(String json, String attributeNamePrefix, String textKey, boolean removeHeader) {
        XmlConvert xmlConvert = new XmlConvert(attributeNamePrefix, textKey, removeHeader);
        return xmlConvert.jsonToXml(json);
    }

    /**
     * json转xml<br/>
     * 默认转换后移除xml头文件
     *
     * @param json                待转换的json串
     * @param attributeNamePrefix 转换后的xml属性名前缀
     * @param textKey             转换后的xml文本键名称
     * @return
     */
    public static String jsonToXML(String json, String attributeNamePrefix, String textKey) {
        return jsonToXML(json, attributeNamePrefix, textKey, true);
    }

    /**
     * json转xml<br/>
     * 默认转换后移除xml头文件,xml文本键名称为#text
     *
     * @param json                待转换的json串
     * @param attributeNamePrefix 转换后的xml属性名前缀
     * @return
     */
    public static String jsonToXML(String json, String attributeNamePrefix) {
        return jsonToXML(json, attributeNamePrefix, "#text", true);
    }

    /**
     * json转xml<br/>
     * 默认转换后移除xml头文件,xml文本键名称为#text,属性名前缀为'@'
     *
     * @param json 待转换的json串
     * @return
     */
    public static String jsonToXML(String json) {
        return jsonToXML(json, "@");
    }

}


        <!-- xml 解析 start -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <!-- xml解析end -->
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这些库都提供了各种将XMLJSON字符串互相转换的方法,具体使用方式如下: 1. Jackson: - 将Java对象转换JSON字符串: ``` ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(myObject); ``` - 将JSON字符串转换为Java对象: ``` ObjectMapper objectMapper = new ObjectMapper(); MyObject myObject = objectMapper.readValue(json, MyObject.class); ``` 2. Gson: - 将Java对象转换JSON字符串: ``` Gson gson = new Gson(); String json = gson.toJson(myObject); ``` - 将JSON字符串转换为Java对象: ``` Gson gson = new Gson(); MyObject myObject = gson.fromJson(json, MyObject.class); ``` 3. xmlpull: - 将XML字符串转换为Java对象: ``` XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(new StringReader(xml)); MyObject myObject = new MyObject(); while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) { if (xpp.getEventType() == XmlPullParser.START_TAG && xpp.getName().equals("myField")) { myObject.setMyField(xpp.nextText()); } xpp.next(); } ``` - 将Java对象转换XML字符串: ``` StringWriter writer = new StringWriter(); XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(writer); serializer.startDocument("UTF-8", true); serializer.startTag("", "myObject"); serializer.startTag("", "myField"); serializer.text(myObject.getMyField()); serializer.endTag("", "myField"); serializer.endTag("", "myObject"); serializer.endDocument(); String xml = writer.toString(); ``` 4. xmlbeans: - 将XML字符串转换为Java对象: ``` XmlObject xmlObject = XmlObject.Factory.parse(xml); MyObject myObject = MyObject.Factory.parse(xmlObject.newInputStream()); ``` - 将Java对象转换XML字符串: ``` MyObject myObject = MyObject.Factory.newInstance(); myObject.setMyField("myValue"); String xml = myObject.xmlText(); ``` 5. dom4j: - 将XML字符串转换为Java对象: ``` Document document = DocumentHelper.parseText(xml); Element root = document.getRootElement(); MyObject myObject = new MyObject(); myObject.setMyField(root.element("myField").getText()); ``` - 将Java对象转换XML字符串: ``` MyObject myObject = new MyObject(); myObject.setMyField("myValue"); Document document = DocumentHelper.createDocument(); Element root = document.addElement("myObject"); Element myField = root.addElement("myField"); myField.setText(myObject.getMyField()); String xml = document.asXML(); ``` 6. jdom: - 将XML字符串转换为Java对象: ``` SAXBuilder builder = new SAXBuilder(); Document document = builder.build(new StringReader(xml)); Element root = document.getRootElement(); MyObject myObject = new MyObject(); myObject.setMyField(root.getChildText("myField")); ``` - 将Java对象转换XML字符串: ``` MyObject myObject = new MyObject(); myObject.setMyField("myValue"); Element root = new Element("myObject"); Element myField = new Element("myField"); myField.setText(myObject.getMyField()); root.addContent(myField); Document document = new Document(root); XMLOutputter outputter = new XMLOutputter(); String xml = outputter.outputString(document); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值