java - 改进在 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 + "/>";
}
}
解决方案
在你摆脱错误之前,让它更小或更通用是没有意义的。它充满了关于输入的假设,例如 XML 元素将在它们开始的同一行结束,或者每行只有一个元素,或者该值不包含特殊字符,如"
or <
。
不要尝试以这种方式“手动”解析 XML,始终使用真正的 XML 解析器。StackOverflow 充斥着这样的问题:“我如何生成像 {insert oddball rule here} 这样的 XML,因为接收应用程序只会接受这种形式的 XML。” 不要成为那个问题的一部分。
推荐阅读
- javascript - 以随机顺序对数组进行排序
- azure - 如何通过 Azure API 管理中的 rest API 更新招摇(开放 API 规范)?是否有任何 Rest API 支持使用 rest api 重新导入?
- java - Resteasy 在 wildfly 14 (Java 11) 上以文本格式导出日期,而不是在 wildfly 9 (Java 8) 上以数字格式导出日期
- php - 如何在php的父节点中添加xml
- .htaccess - 通过别名和 .htaccess 规则访问 webroot 之外的文件
- bash - `bg` 停止进程时,Bash(和其他 shell)如何处理分离 STDIN?
- r - 设置 set 参数后从 0 开始的直方图
- xml - XSD XML 验证问题,S4s-elt-must-match.1
- javascript - 如何在正则表达式中用另一个不同的字符替换不同的字符+数字
- java - JMS 应用程序无法读取 PL1 应用程序创建的 MQ 消息