извлечение классов дел с помощью scala lift-json, когда переменная json - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь извлечь следующие значения JSON

// a 'Change item with a list of values
{
      "@count":"2",
      "change":[{
        "@webLink":"http://localhost:8080/viewModification.html?modId=6&personal=false",
        "@version":"b51fde683e206826f32951750ccf34b14bead9ca",
        "@id":"6",
        "@href":"/httpAuth/app/rest/changes/id:6"
      },{
        "@webLink":"http://localhost:8080/viewModification.html?modId=5&personal=false",
        "@version":"826626ff5d6bc95b32c7f03c3357b31e4bf81842",
        "@id":"5",
        "@href":"/httpAuth/app/rest/changes/id:5"
      }]
    }

// a 'Change item with a single value
{
      "@count":"1",
      "change":{
        "@webLink":"http://localhost:8080/viewModification.html?modId=8&personal=false",
        "@version":"803f9c1cd2c553c3b3fb0c950585be868331b3b1",
        "@id":"8",
        "@href":"/httpAuth/app/rest/changes/id:8"
      }
}

У меня есть следующие классы дел

case class ChangeItem(`@count`: String, change: List[ChangeItemDetail]) {
  def this(`@count`: String, change: ChangeItemDetail) = this(`@count`, List(change))
}
case class ChangeItemDetail(`@webLink`:String, `@version`:String, `@id`:String, `@href`: String)

но с lift-json, похоже, работает только пример JSON с несколькими элементами, бросается один элемент.

      parse(listEx).extract[ChangeItem] // OK
      parse(singleEx).extract[ChangeItem] // throws

Есть ли решение для этого?

1 Ответ

2 голосов
/ 23 ноября 2011

Одним из способов решения этой проблемы является «исправление» JSON путем преобразования его в единый формат.

val json = parse(origJson) transform { 
  case JField("change", o: JObject) => JField("change", JArray(o :: Nil)) 
}

json.extract[ChangeItem]

Это будет работать в обоих случаях.

...