2012-04-13 144 views
1

我想解析一個字符串,但我不知道如何解析它,因爲它不是一個簡單的逗號分析或類似的東西。該字符串我有與此類似:Java解析字符串用引號

String s = "[\"142.5,106.1\",\"142.5,112.1\",\"143.5,119.1\",\"144.5,128.1\",\"146.5,138.1\",\"147.5,148.1\"]"; 

字符串從jsonarray來,這樣,爲什麼格式是它是什麼,但我的目標是分析這一個列表。所以142.5,106.1是一個點的x,y座標,依此類推。任何人都指出了我的正確方向?謝謝。

+1

數據這似乎並不像一個字符串,你的意思是字符串就像'「[\」14 2.5,106.1 \「...'如果我們嘗試初始化它。 – 2012-04-13 18:34:04

+0

對不起話題。你有可能在你的項目中使用scala嗎?這是一個解析器:http://pastebin.com/utAVRLyD – senia 2012-04-13 18:56:46

回答

2

你可以簡單地用一個StringTokenizer類( 「\」[,]「),然後在時間(X,Y,X,Y等)讀取兩個值。

+0

同意。理想情況下,您可以使用GSON自動創建一個數組或List,但如果您擁有的只是一個String,則StringTokenizer或String.split可以很好地工作。 – Shellum 2012-04-13 18:36:16

+0

是的,你說得對Chuck,gson非常好用,非常簡單(不是大多數java庫的精神)。但由於問題似乎很簡單,我認爲這不是必要的。當然,bflosabre,如果你有更多的json來解析你應該考慮谷歌gson。 – 2012-04-13 18:40:20

+0

這就是我最終選擇的,因爲它是最容易實現的,而不必在WCF中進行更改,這是該字符串的來源。我知道它不是理想的方式,但它現在起作用。謝謝大家 – bflosabre91 2012-04-13 18:57:48

1

我不知道我很瞭解你,但我認爲你錯過的只是特殊字符的轉義,而你內部的雙引號使用了反斜槓,就像這樣\「。

+0

那麼如果這不是你的問題,那麼比你的String(「[」142.5,106.1「,」142.5,112.1「,」143.5,119.1「,」144.5,128.1「,」146.5,138.1「,」147.5, 148.1「]」)是垃圾。要麼你錯誤地複製了它,要麼你得到一個編譯錯誤。所以不知道爲什麼downvote – 2012-04-13 18:37:27

+1

我認爲這應該在評論中,因爲這不是一個答案。可能多數民衆贊成投票的原因 – 2012-04-13 18:40:41

+0

是的,但我認爲這就是爲什麼他有一個問題。因爲你肯定無法解析一個斷開的字符串;)但是,無論如何...;) – 2012-04-13 18:42:44

0

我知道這完全不是你問的問題,但我想在你的任務中討論正確的方法,而不是回答你立即發佈的問題。

如果您收到對的JSON數組,我們可以假設它的序列化版本會是這樣的(我猜測在這裏,因爲我很明確的字符串並不像大家分享的一個):

"[[123, 234], [234, 456],...]" 

如果使用這麼有名Gson library解析這個字符串轉換成Java對象,你可以做到這一點就這麼簡單:

String json = "[[123.3, 234.5], [234.1, 456.5]]"; 
    Gson gson = new Gson(); 
    double [][] points = gson.fromJson(json, double[][].class); 
    System.out.println(points[1][1]); 

此輸出:456.5正如預期,你不需要處理解析你自己。

0

如果它總是以相同的格式,你可以像這樣轉換它。

String s ="[\"142.5,106.1\",\"142.5,112.1\"]"; 

      s=s.replace("[", ""); 
      s=s.replace("]", ""); 

      String[] ss=s.split("\""); 
     List list= Arrays.asList(ss); 

list.get(0);=142.5,106.1 // so on ..... 

因爲我明白你的要求。

1

這是我想出的,如果你可以清理括號,它應該使這個更快。可能更好和其他方式來做到這一點,但我用split來分隔所有的逗號。所以列表包含它們以即list.get [0]和list.get [1]是一對等

公共靜態無效的主要(字串[] args){

String s ="[\"142.5,106.1\",\"142.5,112.1\",\"143.5,119.1\",\"144.5,128.1\",\"146.5,138.1\",\"147.5,148.1\"]"; 
    String[] set= s.split(","); 
    ArrayList<Double> list = new ArrayList<Double>(); 
    for(int i=0; i<set.length;i++){ 
     System.out.println(set[i]); 
     list.add(Double.parseDouble(set[i].replaceAll("\\[", "").replaceAll("\"", "").replaceAll("\\]", ""))); 

    } 
    for(int i=0;i<list.size();i++){ 
     System.out.println(list.get(i)); 
    } 
    } 
0

甲簡單而低效率的解決方案將使用String方法是這樣的:

//(being s your example's String) 
    String[] coordinates = s.substring(2, s.length() - 2).split("\",\""); 
    //the two at the beginning and end of the substring is to eliminate braces ([]) and the first and last quotes (") 

座標String數組將包含類似120.1,140.4等