2013-09-04 3 views
2

JSON для синтаксического анализа: http://www.dota2.com/jsfeed/heropickerdata?v=18874723138974056&l=englishPlay 2.1 Чтение JSON объектов с целью

Hero Class и 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 
}) 

Мне нужно получить идентификатор каждого героя. Порядок heros в json соответствует их id. Очевидно, что карта неупорядоченная и не работает. У кого-нибудь есть другие идеи?

Я попытался использовать LinkedHashMap. Я даже пытался сделать неявное чтение для LinkedHashMap, но я потерпел неудачу. Если кто-то думает, что это ответ, пожалуйста, дайте мне несколько советов?

Он просто говорит: «Нет десанциализатора Json для типа scala.collection.mutable.LinkedHashMap [String, models.Hero]. Попробуйте реализовать неявные чтения или формат для этого типа.». У меня есть черта, импортированная в файл, который я пытаюсь прочитать. У меня странное чувство, что последняя строка в моих Чтениях - проблема. Я думаю, я не могу просто сделать asInstanceOf, но у меня нет других идей, как это сделать.

LinkedHashMap неявной Читает Код: http://pastebin.com/cf5NpSCX

+0

Другой альтернативой было бы, вероятно, получить «Seq», а затем в коде изменить его на LinkedHashMap – Jatin

+0

Проблема с этим - мне также нужно сохранить ключи. – Commander

ответ

0

Вы можете попытаться извлечь данные в порядке от JsObject возвращенного Json.parse непосредственно, возможно, как это:

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 
} 

Я не верю, что вы будете нуждаться в сохраняющей порядок карты, поскольку идентификаторы порождаются и фиксируются.

+0

В нем говорится, что есть ошибка для toMap. "- Невозможно доказать, что модели.Hero \t <: <(T, U)." Я понятия не имею, что это значит: P – Commander

+0

Попробуйте удалить изменяемый квалификатор (var) из id в Hero, поскольку Map неизменен. – danielkza

+0

К сожалению, это не сработало – Commander

Смежные вопросы