2016-05-30 111 views
0

我試圖將鍵值對的字符串轉換爲JSON字符串。關於KV對串的唯一知識是串的格式,即分隔空間,逗號分隔等等。對於例如我無法控制作爲輸入進入的鍵的數量或類型。將鍵值對的字符串轉換爲JSON字符串(Scala)的習慣方式

這是我想出來的,並且想看看這種方法看起來是好的還是令人敬畏的/尷尬的。如果有比這更好的替代方案,將不勝感激。

INPUT : clientIp="1.1.1.1" identifier="a.b.c" key1=10 key2="v3" 

final val KV_PATTERN = "(\"[^\"]*\"|[^,\\\"\\s]*)=(\"[^\"]*\"|[^,\\\"\\s]*)".r 

val cMap = KV_PATTERN.findAllMatchIn(inputString).map(m => (m.group(1).trim(), m.group(2).trim())).toMap 

val json = cMap.map { case (key, value) => if (!key.startsWith("\"")) s""""$key"""" + ":" + value else s"$key:$value" }.mkString("{", ",", "}")` 

OUTPUT: {"clientIp":"1.1.1.1","identifier":"a.b.c","key1":10,"key2":"v3"} 
+1

你所做的只是用逗號替換空格,並在字符串周圍放置一對大括號。只是說......'「{$ {s.replaceAll(」「,」,「)}}」'。順便說一句,這不是真正有效的json。 – Dima

+0

迪馬 - 當然在你的情況下......還有很多你錯過的其他情況。 。所有的鍵都需要在JSON中引用.replace key value seperator with:爲了使它通用,使用正則表達式模式方法,我可以根據輸入格式更改它。用我的方法,我證實它確實是一個有效的JSON – codehammer

+0

這不是「我的情況」,這是你的情況。你問過的情況。 當然,如果你對一個不同的正則表達式,它將是一個不同的情況下......你可以正確的不同的斯卡拉代碼,爲另一種情況。有些人更喜歡用scala編寫代碼,其他人更喜歡正則表達式......我猜,味道問題。不,你在你的問題中引用的是無效的json。 – Dima

回答

2
"{"+ inputString.split(" ").map{case i => val t = i.split("="); s""""${t(0).replaceAll("^\"|\"$", "")}": ${t(1)}"""}.mkString(",") + "}" 

這也許是更清潔。

+0

謝謝。 +1 ..這也可以。你認爲通過正則表達式和地圖使用它會更加昂貴嗎? – codehammer

相關問題