Java 从String.split返回的字符串包含部分匹配元素

Java 从String.split返回的字符串包含部分匹配元素,java,Java,输出是 final String json = "\"name\" : \"john\" , \"worth\" : \"123,456\""; String[] ss = json.split("\"\\s*,\\s*\""); System.out.println(json); for (String s : ss) { System.out.println("--> " + s); } 有什么办法可以让我去吗 "name" : "john" , "worth" :

输出是

final String json = "\"name\" : \"john\" , \"worth\" : \"123,456\"";    
String[] ss = json.split("\"\\s*,\\s*\"");
System.out.println(json);
for (String s : ss) {
    System.out.println("--> " + s);
}
有什么办法可以让我去吗

"name" : "john" , "worth" : "123,456"
--> "name" : "john
--> worth" : "123,456"

这有点像自己解析XML。你可以做到,但为什么要麻烦呢?有很多可用的。使用其中一种方法可以避免重蹈覆辙。

这有点像自己解析XML。你可以做到,但为什么要麻烦呢?有很多可用的。使用其中一个,以避免重新发明轮子。

使用正则表达式 虽然我必须同意使用JSON解析器更有意义,但即使您想使用正则表达式,String.split()也不是正确的工具。使用a和a:

输出:

final String json = "\"name\" : \"john\" , \"worth\" : \"123,456\"";
final Pattern pattern =
    Pattern.compile("\"(.*?)\"\\s*:\\s*\"(.*?)\"", Pattern.DOTALL);
final Matcher matcher = pattern.matcher(json);
while(matcher.find()){
    System.out.println(matcher.group(1) + ":" + matcher.group(2));
}
final Pattern pattern =
    Pattern.compile("(\".*?\")\\s*:\\s*(\".*?\")", Pattern.DOTALL);
如果您真的想检索引号,请将模式更改为

name:john
worth:123,456
输出:

final String json = "\"name\" : \"john\" , \"worth\" : \"123,456\"";
final Pattern pattern =
    Pattern.compile("\"(.*?)\"\\s*:\\s*\"(.*?)\"", Pattern.DOTALL);
final Matcher matcher = pattern.matcher(json);
while(matcher.find()){
    System.out.println(matcher.group(1) + ":" + matcher.group(2));
}
final Pattern pattern =
    Pattern.compile("(\".*?\")\\s*:\\s*(\".*?\")", Pattern.DOTALL);
当然,这对不同的JSON结构(如嵌套对象结构、数组、原语等)没有帮助


使用JSON解析器 但是,如果您的问题只是关于如何使用JSON解析器实现这一点,那么下面是一个使用:

使用正则表达式 虽然我必须同意使用JSON解析器更有意义,但即使您想使用正则表达式,String.split()也不是正确的工具。使用a和a:

输出:

final String json = "\"name\" : \"john\" , \"worth\" : \"123,456\"";
final Pattern pattern =
    Pattern.compile("\"(.*?)\"\\s*:\\s*\"(.*?)\"", Pattern.DOTALL);
final Matcher matcher = pattern.matcher(json);
while(matcher.find()){
    System.out.println(matcher.group(1) + ":" + matcher.group(2));
}
final Pattern pattern =
    Pattern.compile("(\".*?\")\\s*:\\s*(\".*?\")", Pattern.DOTALL);
如果您真的想检索引号,请将模式更改为

name:john
worth:123,456
输出:

final String json = "\"name\" : \"john\" , \"worth\" : \"123,456\"";
final Pattern pattern =
    Pattern.compile("\"(.*?)\"\\s*:\\s*\"(.*?)\"", Pattern.DOTALL);
final Matcher matcher = pattern.matcher(json);
while(matcher.find()){
    System.out.println(matcher.group(1) + ":" + matcher.group(2));
}
final Pattern pattern =
    Pattern.compile("(\".*?\")\\s*:\\s*(\".*?\")", Pattern.DOTALL);
当然,这对不同的JSON结构(如嵌套对象结构、数组、原语等)没有帮助


使用JSON解析器 但是,如果您的问题只是关于如何使用JSON解析器实现这一点,那么下面是一个使用:


除了当前输出中缺少两个引号外,当前输出和所需输出之间没有差异。那是你指的吗?对问题的简单描述远不止代码本身……您的“副作用”是可以预测的,所以最简单的方法可能就是像现在这样解析字符串,然后再“修复”它。或者你可以使用专用的json解析器,除了当前输出中缺少两个引号外,当前输出和所需输出之间没有区别。那是你指的吗?对问题的简单描述远不止代码本身……您的“副作用”是可以预测的,所以最简单的方法可能就是像现在这样解析字符串,然后再“修复”它。也可以使用专用的json解析器,因为大多数json解析器都需要我定义一个类。但是,我得到的字符串响应经常被动态更改。响应字符串中的属性数并不总是固定的。我只是不想发布一个新的软件,因为它的属性数量太多了different@Yan:虽然一些解析器可能要求您拥有一个现有的类来序列化到/从中序列化,但我肯定不是所有解析器都这样做-例如,请参阅seanizer的答案。您不需要一个以上的解析器来实现您想要的功能,是吗?因为大多数JSON解析器都需要my来定义一个类。但是,我得到的字符串响应经常被动态更改。响应字符串中的属性数并不总是固定的。我只是不想发布一个新的软件,因为它的属性数量太多了different@Yan:虽然一些解析器可能要求您拥有一个现有的类来序列化到/从中序列化,但我肯定不是所有解析器都这样做-例如,请参阅seanizer的答案。你不需要一个以上的解析器来完成你想要的,是吗?谢谢。JSONObject确实符合我的要求。格森没有,谢谢。JSONObject确实符合我的要求。格森没有。