Java 将字符串(使用正则表达式)转换为可用对象

Java 将字符串(使用正则表达式)转换为可用对象,java,json,regex,Java,Json,Regex,对于一个项目,我们正在使用telnet服务器,从该服务器接收数据。 从telnet连接读取线路后,我得到以下字符串: 原始字符串: SVR GAME MOVE {PLAYER: "PLAYER", MOVE: "1", DETAILS: ""} 我正在尝试将其转换为一个输出,我可以很容易地使用,而不会发生太多的可利用性。 所需的格式将是轻松获取(播放器)或获取。我尝试将正则表达式与json结合使用,请参见下面的代码: String line = currentLine; line = line

对于一个项目,我们正在使用telnet服务器,从该服务器接收数据。 从telnet连接读取线路后,我得到以下字符串:

原始字符串:

SVR GAME MOVE {PLAYER: "PLAYER", MOVE: "1", DETAILS: ""}
我正在尝试将其转换为一个输出,我可以很容易地使用,而不会发生太多的可利用性。 所需的格式将是轻松获取(播放器)或获取。我尝试将正则表达式与json结合使用,请参见下面的代码:

String line = currentLine;
line = line.replaceAll("(SVR GAME MOVE )", ""); //remove SVR GAME MATCH
line = line.replaceAll("(\"|-|\\s)", "");//remove quotations and - and spaces (=\s)
line = line.replaceAll("(\\w+)", "\"$1\""); //add quotations to every word
JSONParser parser = new JSONParser();
try {
       JSONObject json = (JSONObject) parser.parse(line);
       //@todo bug when details is empty causes
       //@todo example string: SVR GAME MOVE {PLAYER: "b", MOVE: "1", DETAILS: ""}
       //@todo string that (line) that causes an error when parsing to json {"PLAYER":"b","MOVE":"1","DETAILS":}
       //@todo Unexpected token RIGHT BRACE(}), i think because "details" has no value
       System.out.println(json.get("PLAYER"));
       System.out.println(json.get("MOVE"));
       System.out.println(json.get("DETAILS"));
       int index = Integer.valueOf(json.get("MOVE").toString());
       for(GameView v : views){
          v.serverMove(index);//dummy data is index 1
       }
    } catch (ParseException e) {
        e.printStackTrace();
}
问题是,当详细信息为空时,这将导致意外的标记右大括号(})。此外,当玩家在他们的名字中引用攻击性的名字时,代码很容易崩溃

将原始字符串转换为输出的最佳方法是什么,这样您可以轻松获得单独的设置(播放器、移动、详细信息)?使用,您可以执行以下操作:

String input = "{PLAYER: \"PLAYER\", MOVE: \"1\", DETAILS: \"\"}";

ObjectMapper mapper = new ObjectMapper();
JsonNode yourJson = mapper.readTree(input);
System.out.println(yourJson.get("PLAYER"));
System.out.println(yourJson.get("MOVE"));
System.out.println(yourJson.get("DETAILS"));

这将解析字符串并将变量放入映射中:

    Map<String,String> vars = new HashMap<>();
    String input = "SVR GAME MOVE {PLAYER: \"PLAYER\", MOVE: \"1\", DETAILS: \"\"}";
    Pattern pattern = Pattern.compile("([A-Za-z]+): \"([^\"]*)\"");
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        vars.put(matcher.group(1), matcher.group(2));
    }
Map vars=newhashmap();
String input=“SVR游戏移动{PLAYER:\'PLAYER\',移动:\'1\',详细信息:\'”;
Pattern=Pattern.compile(([A-Za-z]+):\”([^\“]*)\”;
Matcher Matcher=pattern.Matcher(输入);
while(matcher.find()){
变量put(matcher.group(1)、matcher.group(2));
}

<代码> > { }中的字符串,在<代码>下拆分,<代码>,然后可以在<代码>中再次拆分:您应该得到第一个<代码> { <代码> >最后的<代码> } /代码>并考虑您的JSON字符串。用JSON解析库解析它(因为正则表达式不适合嵌套的属性)我不相信使用JSON解析器是正确的做法。@MauricePerry您会建议使用正则表达式?@Jouke我相信我会使用正则表达式,是的,它能解析字符串吗?它不是有效的JSON。结果是com.fasterxml.jackson.core.JsonParseException:意外字符('P'(代码80)):需要双引号来开始字段名问题是PLAYER、MOVE和DETAILS不包含引号(默认JSON格式).我试着用原始代码中显示的正则表达式修复它。但我无法让它正常工作。有什么想法吗?@Jouke yes:属性名称必须在quotes@MauricePerry它会的。如果你没有转义符,它就是一个有效的json。@Jouke我的输入字符串有转义符只是为了演示。没有转义符,它就变成了有效的json。只是一个简单的例子下面请澄清:第一组:([A-Za-z]+)://匹配A-z或A-z中的任何字符,+表示1个或多个,以结尾:因此第一组匹配以以下结尾的每个单词:第二组:“([^”]*”//匹配”,然后[^”]=匹配不在集合中的单个字符,*=在零次和多次之间,以A结尾”。因此,第二组匹配引号之间的所有内容,并检查其本身是否不包含引号(您的正则表达式向导;)非常感谢你。