首页 > 解决方案 > 改进在 Java 中将 Json 转换为 XML 和反之亦然的程序

问题描述

在重构 Java 代码时需要一些帮助,该代码将一个字符串作为 XML 标记或 JSON 键值对的输入,并返回等效的 JSON 或 XML。程序中只使用简单的 String 方法。我想要关于如何使代码变得更小和更通用的建议。在某些情况下,代码会失败。例如,将属性添加到 XML 时。在这些情况下是否有任何模块或技巧非常有用?代码是 -

package converter;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String inputString = sc.nextLine(); // input string
        if (inputString.startsWith("<")) { // if string is xml
            if (inputString.contains("/>")) { // if xml is a self closing tag
                int startIndex = inputString.indexOf('<');
                int endIndex = inputString.indexOf("/>");
                String key = inputString.substring(startIndex+1,endIndex);
                System.out.println(createJSON(key));
            }
            else {
                String key = extractKeyFromXML(inputString);
                String value = extractValueFromXML(inputString);
                System.out.println(createJSON(key,value));
            }
        }
        else if (inputString.startsWith("{")) { // if string is JSON
            if(inputString.contains("null")) { // if JSON contains a null value
                String key = extractKeyFromJSON(inputString);
                System.out.println(createXML(key));
            }
            else {
                String key = extractKeyFromJSON(inputString);
                String value = extractValueFromJSON(inputString);
                System.out.println(createXML(key, value));
            }
        }
    }

    public static String extractKeyFromXML(String xmlStr) {
        int startIndex = xmlStr.indexOf('<');
        int endIndex = xmlStr.indexOf('>');
        return xmlStr.substring(startIndex + 1, endIndex).trim();
    }

    public static String extractValueFromXML(String xmlStr) {
        int startIndex = xmlStr.indexOf('>');
        int endIndex = xmlStr.indexOf("</");
        return xmlStr.substring(startIndex + 1, endIndex).trim();
    }

    public static String createJSON(String key, String value) {
        return "{\"" + key + "\":\"" + value + "\"}";
    }

    public static String createJSON(String key) {
        return "{\"" + key + "\" : null }";
    }

    public static String extractKeyFromJSON(String jsonStr) {
        int startIndex = jsonStr.indexOf('{');
        int endIndex = jsonStr.indexOf(':');
        return jsonStr.substring(startIndex + 1, endIndex).replaceAll("\"", "").strip();
    }

    public static String extractValueFromJSON(String jsonStr) {
        int startIndex = jsonStr.indexOf(':');
        int endIndex = jsonStr.indexOf("}");
        return jsonStr.substring(startIndex + 1, endIndex).replaceAll("\"", "").strip();
    }

    public static String createXML(String key, String value) {
        return "<" + key + ">" + value + "</" + key + ">";
    }

    public static String createXML(String key) {
        return "<" + key + "/>";
    }

}

标签: javajsonxml

解决方案


在你摆脱错误之前,让它更小或更通用是没有意义的。它充满了关于输入的假设,例如 XML 元素将在它们开始的同一行结束,或者每行只有一个元素,或者该值不包含特殊字符,如"or &lt;

不要尝试以这种方式“手动”解析 XML,始终使用真正的 XML 解析器。StackOverflow 充斥着这样的问题:“我如何生成像 {insert oddball rule here} 这样的 XML,因为接收应用程序只会接受这种形式的 XML。” 不要成为那个问题的一部分。


推荐阅读