У меня есть следующая структура данных:
val jsonStr = """
{
"data1": {
"field1": "data1",
"field2": 1.0,
"field3": true
},
"data211": {
"field1": "data211",
"field2": 4343.0,
"field3": false
},
"data344": {
"field1": "data344",
"field2": 436778.51,
"field3": true
},
"data41": {
"field1": "data41",
"field2": 14348.0,
"field3": true
}
}
"""
Я хочу извлечь его. Вот что я делаю без везения:
#1.
case class Fields(field1: String, field2: Double, field3: Boolean)
json.extract[Map[String, Map[Fields, String]]]
//org.json4s.package$MappingException: Do not know how to convert JBool(true)
//into class java.lang.String
#2.
json.extract[Map[String, Map[String, Fields]]
//java.lang.InternalError: Malformed class name
#3.
json.extract[Map[String, Map[String, Any]]]
//org.json4s.package$MappingException: No information known about type
#4.
json.extract[Map[String, Map[String, String]]]
//org.json4s.package$MappingException: Do not know
//how to convert JBool(true) into class java.lang.String
Как мне это сделать тогда?
P.S. -- на самом деле это https://github.com/json4s/json4s, но это не имеет большого значения так как lift
имеет тот же API в отношении извлечения json.
ОБНОВЛЕНИЕ: возможно, потребуется использовать метод преобразования. Как я буду его использовать?
val json = parse(jsonStr) transform {
case //.... what should be here to catch JBool -- "field3"?
}
ОБНОВЛЕНИЕ 2:
#5
json.extract[Map[String, Map[String, JValue]]]
// Works! but it's not what I'm looking for, I need to use a pure Java/Scala type
json.extract[Map[String, Fields]]
кажется, работает для меня. Двойная структураMap
этого не делает. Что хотела захватить вторая карта? - person jcern   schedule 07.06.2013json4s
, потому что версия лифта, кажется, работает для меня (или я сделал что-то дополнительное, чего я не понял). Возможно, это как-то связано с форматами, которые он использует для извлечения. - person jcern   schedule 07.06.2013