2013-12-12 101 views
2

我不知道,如果是可以做到的,但我想解析一个非常简单的JSON文件到字符串数组。使用正则表达式来分析一个非常简单的JSON文件

示例文件:

["String1", "String2", "oneMoreString"] 

到目前为止,我想我会用扫描仪用一个模式来得到我的输出,但没能做到这一点。

ArrayList<String> strings = new ArrayList<String>(); 
    File f = new File("src/sample.txt"); 
    String pattern = "\\s*[\"\"]\\s*"; 
    try { 
     InputStream is = new FileInputStream(f); 
     Scanner s = new Scanner(is); 
     s.useDelimiter(pattern); 
     while (s.hasNext()){ 
      strings.add(s.next()); 
     } 
     s.close(); 
     is.close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

因为该模式显然是错误的,因为它认为“”因为它适合,但我想它不会被列入...:S

我也接受建议,可以任何其他方式工作,这可以解析。也许是一个JSON解析器?但由于文件太简单了,我认为没有必要。

+3

你可以看看GSON解析器http://code.google.com/p/google-gson/ – Sach

+0

得到了我的路径http://jackson.codehaus.org/,但似乎矫枉过正使用JSON解析器... – Daren

+2

@达人,不,根本不会矫枉过正(使用杰克逊/吉森)。引入10行以上的正则表达式代码来处理简单的JSON字符串不是要走的路(IMO)。 –

回答

3

最好是使用JSON解析器像杰克逊映射到JSON字符串解析。

但是,如果你有一个简单的字符串,你可以快速使用一个样本正则表达式给它。

尝试了这一点:

String str = "[\"String1\", \"String2\", \"oneMoreString\"]"; 

    Pattern pattern = Pattern.compile("\"(.+?)\""); 
    Matcher matcher = pattern.matcher(str); 

    List<String> list = new ArrayList<String>(); 
    while (matcher.find()) { 
     // System.out.println(matcher.group(1));. 
     list.add(matcher.group(1)); 
    } 
+0

匹配器只检测字符串,而不是输入流...你可以用扫描仪试试吗?对我来说这似乎没有工作.. thnx! – Daren

+0

可以使用的FileInputStream读取数据读取数据流,然后将它传递给匹配。 –

+0

之前你建议它,它的工作原理。谢谢。 – Daren

-1

,而不是分析它像上面你可以使用任何可用的Java JSON解析器

+0

我知道,除了我不了解reg-exp的情况之外,有什么理由这么做?在我看来,似乎矫枉过正。 – Daren

+0

考虑这种方式,您解析JSON(JavaScript对象符号),必须遵守一些规则,就像是一个键值对由{}包围等。通常库,例如GSON或杰克逊(上述)在此提供一些验证方面避免了错误的json输入,并且通常(我已经与两个人一起工作)他们在性能上做得很好;如果你需要的话,还可以使用json lib为你提供其他功能以便将来扩展。如果您担心表现不佳,您可以通过编写两种方法并测量运行所需时间来进行基准测试,差异会很小。 – Fawix

1
//split by , 
String strings[] = s.split(","); 
//remove [ from first string 
strings[0] = strings[0].substring(1); 
//remove ] from last string 
String last = strings[strings.length - 1]; 
strings[strings.length - 1] = last.substring(0, last.length() - 1); 
+0

巧妙... xD不漂亮,但应该工作。 – Daren

+0

@Daren好,你想避免JSON解析器:) –

+0

会被作为's.substring容易(1,s.length() - 1(也许2))。分裂( “”)' –

3

看到你在classpath有杰克逊,只需做:

ObjectMapper mapper = new ObjectMapper(); 
String[] array = mapper.readValue("[\"String1\", \"String2\", \"oneMoreString\"]", String[].class); 
System.out.println(Arrays.toString(array)); 

将打印:

[String1, String2, oneMoreString] 
+0

我会接受他的解决方案(因为问题有正则表达式),但使用你的,谢谢。得到我的赞赏。 – Daren

+0

没问题,不用客气。 –

相关问题