2013-10-11 4 views
1

JSON을 스칼라로 파싱하려고하는데 아주 성공적이지 않습니다. 다음은 JSON 구조입니다.스칼라 구문 분석 JSON

{ 
    "data" : "test", 
    "field" : "test", 
    "listObj" : [{ 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } , { 
     "data" : "testInner2", 
     "field" : "testInner2" 
    }], 
    "obj" : { 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } 
} 

리프트를 사용하고 있습니다. 여기에 내 코드입니다 :

import net.liftweb.json._ 

implicit val formats = DefaultFormats 
case class MyJson(data: String, field: String, obj: MyJson, listObj: List[MyJson]) 
val json = parse(""" 
{ 
    "data" : "test", 
    "field" : "test", 
    "listObj" : [{ 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } , { 
     "data" : "testInner2", 
     "field" : "testInner2" 
    }], 
    "obj" : { 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } 
}""") 
println(json.extract[Query]) 

나는 다음과 같은 예외 신을했습니다 :

Caused by: net.liftweb.json.MappingException: No usable value for operation 
Did not find value which can be converted into java.lang.String 
at net.liftweb.json.Meta$.fail(Meta.scala:191) 
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357) 
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317) 
at net.liftweb.json.Extraction$$anonfun$13.apply(Extraction.scala:253) 
at net.liftweb.json.Extraction$$anonfun$13.apply(Extraction.scala:253) 
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
at scala.collection.immutable.List.foreach(List.scala:318) 
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253) 
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286) 
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315) 
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351) 
... 34 more 
Caused by: net.liftweb.json.MappingException: Did not find value which can be converted into java.lang.String 
at net.liftweb.json.Meta$.fail(Meta.scala:191) 
at net.liftweb.json.Extraction$.convert(Extraction.scala:403) 
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:314) 
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351) 
... 46 more 

내가 json4s를 사용 해봤를하지만 난 그게 경우 클래스로 구문 분석 할 수 있도록 관리 할 수 ​​있습니다. 내 JSON에서 obj 및 objList를 제거하면 잘 동작합니다.

누구나 이런 종류의 구조를 구문 분석하여 스칼라에서 읽을 수 있습니다. obj이 옵션 값이되도록

+0

"재귀 적"이 아닌 "중첩 된"을 의미합니까? 재귀 객체는 대개 자체에 대한 중첩 포인터를 포함합니다. – nafg

+0

재귀 적. json 객체 자체에 포함되어 있습니다. – Augusto

+0

여기에는 * 자체 *가 포함되어 있습니다 (어떻게 볼 수 있습니까?) 또는 동일한 * 유형의 객체 *가 포함되어 있습니까? – nafg

답변

3
귀하의 경우 클래스 정의를 변경

: json으로 추출 여전히 JSON은 "obj" 필드를 부족하더라도 생산 MyJson의 인스턴스를 할 수 있도록

case class MyJson(data: String, 
    field: String, 
    // obj: MyJson,  // from 
    obj: Option[MyJson], // to 
    listObj: List[MyJson]) 

이 필요가 (이 그것을 귀하의 예제에서 중첩 된 구조 내에서).

listObj의 경우에는 필요하지 않습니다. json에 "listObj" 필드가 없어도 여전히 List[MyJson]의 빈 목록으로 표시 될 수 있기 때문입니다.

+0

대단히 감사합니다! 잘 잘 :) – Augusto