2013-09-04 5 views
2

2.1 독서 JSON 개체를 재생 : http://www.dota2.com/jsfeed/heropickerdata?v=18874723138974056&l=englishJSON을 구문 분석하기 위해

영웅 클래스와 JSON 직렬화를

case class Hero(
    var id:Option[Int], 
    name: String, 
    bio: String, 
     var trueName:Option[String] 
){} 
implicit val modelReader: Reads[Hero] = Json.reads[Hero] 

데이터 읽기

val future: Future[play.api.libs.ws.Response] = WS.url("http://www.dota2.com/jsfeed/heropickerdata?v=18874723138974056&l=english").get() 
val json = Json.parse(Await.result(future,5 seconds).body).as[Map[String, Hero]] 

var i = 1 
json.foreach(p => { 
      p._2.trueName = Some(p._1) 
    p._2.id = Some(i) 
    p._2.commitToDatabase 
    i += 1 
}) 

나는 각 영웅의 ID를 얻을 필요가있다. json의 히어로 순서는 ID와 일치합니다. 분명히지도는 순서가없고 작동하지 않을 것입니다. 누구든지 다른 아이디어가 있습니까?

LinkedHashMap을 사용하려고했습니다. LinkedHashMap에 대한 암시 적 읽기를 시도했지만 실패했습니다. 누군가 이것이 이것이 대답이라고 생각하면 나에게 약간의 지침을 주시겠습니까?

그냥 "No Json 디시리얼라이저가 scala.collection.mutable.LinkedHashMap [String, models.Hero] 유형에 대해 발견되었습니다.이 유형에 대한 암시 적 읽기 또는 형식 구현을 시도하십시오.". 내가 읽으려고하는 파일에 특성을 가져 왔습니다. 내 읽기의 마지막 줄이 문제라는 재미있는 느낌이 들었습니다. 나는 asInstanceOf를 수행 할 수 없다고 생각하지만,이 작업을 수행하는 방법에 대한 다른 아이디어는 없습니다. 암시 적

의 LinkedHashMap 코드 읽기 : http://pastebin.com/cf5NpSCX

+0

또 다른 방법은 아마도 'Seq'로 가져온 다음 코드에서 LinkedHashMap으로 변경하는 것입니다. – Jatin

+0

그 문제는 키를 보존해야한다는 것입니다. – Commander

답변

0

당신은 아마도 다음과 같이 직접 Json.parse에 의해 반환 된 JsObject에서 순서대로 데이터를 추출 시도 할 수 있습니다 :

val json = Json.parse(Await.result(future,5 seconds).body) 
val heroes: Map[String, Hero] = json match { 
    case obj: JsObject => 
    obj.fields.zipWithIndex.map{ case ((name: String, heroJson: JsValue), id) => 
     heroJson.asOpt[Hero].map{ _.copy(id = Some(id)) } 
    }.flatten.toMap 
    case _ = > Seq.empty 
} 

나는 당신이 필요합니다 생각하지 않는다 ID가 생성되고 고정 된 이후 더 이상 주문 보존지도가 아닙니다.

+0

toMap에 오류가 있음을 나타냅니다. "- 해당 모델을 증명할 수 없습니다. 영웅 \t <: <(T, U)." 그게 무슨 뜻인지 전혀 모르겠다 : P – Commander

+0

맵이 불변이므로 Hero의 id에서 mutable 한정자 (var)를 제거해보십시오. – danielkza

+0

불행히도 그게 작동하지 않았다 – Commander

관련 문제