2017-06-24 30 views
-2

我是新來的正則表達式! 我想從可能包含多個JSON對象的字符串中獲取特定的JSON對象。 我有如下一個文件類似的線,正則表達式匹配文件中每行的單個json對象

週一1月20日○時00分21秒-0800 2014年,

{ 「CL」: 「JS」, 「上」: 「AAA」 , 「IP」: 「50.100.200.210」, 「CC」: 「美國」, 「RG」: 「CA」, 「CT」: 「CAA」, 「PC」: 「94538」, 「MC」:807,」 bf「:」9d9b0900247ab80b9dc4c60013245fa36d8d4dc4「,」vst「:」2074ae4d-9969-4103-9637-92a31ba8a108「,」lt「:」Mon Jan 20 00:00:14 -0800 2014「,」hk「:[」sub「 ,「hatch」]}, {「v」:「1.1」,「pv」:「cc4c68d2-54b3-4607-9578-619f68b97947」,「r」:「v3」,「t」:「f1951bc8」一個 「:[{」 I 「:2,」 U 「:」 u.jpg 「 」W「:800, 」H「:532, 」×「:198, 」Y「:1655, 」LT「:」無」, 「AF」:假}], 「RF」: 「正則表達式」, 「p」: 「階」, 「FS」:真, 「TR」:0.9, 「AC」:{ 「20722」:1} , 「VP」:{ 「II」:假, 「W」:1905, 「H」:955}, 「SC」:{ 「W」:1920, 「H」:10 80, 「d」:1}, 「PID」:7343, 「VID」:8}

我想分析整個字符串並提取JSON對象作爲其由在密鑰 「PV」 JSON串第三列JSON對象。可能有一些行沒有第一個JSON對象,但行中有時間列和第二個JSON對象。

我發現\{([^{}]|)*\}這是從另一個帖子中找到的,它匹配了總共第一個JSON對象和第二個對象的部分表達式!我只需要從總行中獲得第二個JSON,它的結構中有「pv」鍵!任何建議給予表達只得到第三列!

回答

0

可以使用liftweb JSON庫是這樣的:

import net.liftweb.json._ 
val p = net.liftweb.json.parse("""[{"cl":"js","up":"aaa","ip":"50.100.200.210","cc":"US","rg":"CA","ct":"CAA","pc":"94538","mc":807,"bf":"9d9b0900247ab80b9dc4c60013245fa36d8d4dc4","vst":"2074ae4d-9969-4103-9637-92a31ba8a108","lt":"Mon Jan 20 00:00:14 -0800 2014","hk":["sub","hatch"]}, {"v":"1.1","pv":"cc4c68d2-54b3-4607-9578-619f68b97947","r":"v3","t":"f1951bc8","a":[{"i":2,"u":"u.jpg","w":800,"h":532,"x":198,"y":1655,"lt":"none","af":false}],"rf":"regex","p":"scala","fs":true,"tr":0.9,"ac":{"20722":1},"vp":{"ii":false,"w":1905,"h":955},"sc":{"w":1920,"h":1080,"d":1},"pid":7343,"vid":8}]""") 
compact(render(p \\ "pv")) 
res3: String = "cc4c68d2-54b3-4607-9578-619f68b97947" 

\\操作執行給定鍵進行搜索。在這裏看到更多的信息:https://github.com/lift/lift/tree/master/framework/lift-base/lift-json

注 - 我加方括號的JSON字符串的開始和結束,以便它是有效的JSON ..

0

你也可以使用原生JSON階像庫這個:

val p2 = scala.util.parsing.json.JSON.parseFull("""[{"cl":"js","up":"aaa","ip":"50.100.200.210","cc":"US","rg":"CA","ct":"CAA","pc":"94538","mc":807,"bf":"9d9b0900247ab80b9dc4c60013245fa36d8d4dc4","vst":"2074ae4d-9969-4103-9637-92a31ba8a108","lt":"Mon Jan 20 00:00:14 -0800 2014","hk":["sub","hatch"]}, {"v":"1.1","pv":"cc4c68d2-54b3-4607-9578-619f68b97947","r":"v3","t":"f1951bc8","a":[{"i":2,"u":"u.jpg","w":800,"h":532,"x":198,"y":1655,"lt":"none","af":false}],"rf":"regex","p":"scala","fs":true,"tr":0.9,"ac":{"20722":1},"vp":{"ii":false,"w":1905,"h":955},"sc":{"w":1920,"h":1080,"d":1},"pid":7343,"vid":8}]""") 

p2.flatMap { l => Some(l.asInstanceOf[List[Map[String,Any]]]) }. 
    flatMap(l2 => { Some(l2.flatMap(m => { 
    m.get("pv") 
    })) 
}) 

res37: Option[List[Any]] = Some(List(cc4c68d2-54b3-4607-9578-619f68b97947))