我正在尝试将lift-json的JValue中的解析后的JSON文档转换为Casbah MongoDBObject - 有没有办法做到这一点?
我正在遇到一种情况,我从外部服务器检索一些Json(我对该服务器没有任何控制权).Json有一个元素可能会出现一次或多次.我正在尝试使用net.liftweb.json工具解析它,只有在元素出现多次时才能正常工作.如果元素只出现一次,则无法解析.
这是一些示例代码:
import net.liftweb.json._
import net.liftweb.json.JsonDSL._
case class JSonListIssue(foo: List[String])
class JSonTest extends TestCase {
implicit val formats = net.liftweb.json.DefaultFormats;
def testJsonList {
val jsonStr2Foos = "{\"foo\": \"bar\", \"foo\": \"bar2\"}"
val json = (parse(jsonStr2Foos).extract[JSonListIssue])
assertEquals(2, json.foo.size)
val jsonStr1Foo = "{\"foo\": \"bar\"}"
val json2 = (parse(jsonStr1Foo).extract[JSonListIssue]) // Results in Json MappingException
assertEquals(1, json2.foo.size)
}
}
Run Code Online (Sandbox Code Playgroud)
第二个解析语句在上面的代码中失败.如果我将如下定义case类,第二个解析将起作用,但第一个解析将失败.
case class JSonListIssue(foo: String)
Run Code Online (Sandbox Code Playgroud)
关于如何以干净的方式解决这个问题的任何建议?我当然可以捕获MappingException,然后使用其他case类解析它,但那脏...
谢谢,Gero
我有以下数据结构:
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
}
}
"""
Run Code Online (Sandbox Code Playgroud)
我想要提取它.这是我正在做的没有任何运气:
#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]]] …Run Code Online (Sandbox Code Playgroud) 我有一些带有一些字段的json,我想检查它们中是否有一些存在.我正在提取值并针对JNothing测试它,但它太冗长了:
val json: JValue = ...
val jsonIsType1 = (json \ "field1") != JNothing && (json \ "field2") != JNothing
Run Code Online (Sandbox Code Playgroud)
是否有更紧凑的方法使用json4s/lift-json检查json对象中是否存在字段?理想情况如下:
val jsonIsType1 = json.has("field1") && json.has("field2")
Run Code Online (Sandbox Code Playgroud) 我有一个JSON,可以通过时间和使用的情况下更改类可能是unconvenient,因为我需要每次改变它的结构的JSON变化.
例如,如果我有这样的JSON:
val json= """{
"accounts": [
{ "emailAccount": {
"accountName": "YMail",
"username": "USERNAME",
"password": "PASSWORD",
"url": "imap.yahoo.com",
"minutesBetweenChecks": 1,
"usersOfInterest": ["barney", "betty", "wilma"]
}},
{ "emailAccount": {
"accountName": "Gmail",
"username": "USER",
"password": "PASS",
"url": "imap.gmail.com",
"minutesBetweenChecks": 1,
"usersOfInterest": ["pebbles", "bam-bam"]
}}
]
}"""
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式访问它:
val parsedJSON = parse(json)
parsedJSON.accounts(0).emailAccount.accountName
Run Code Online (Sandbox Code Playgroud) 我想反序列化使用lift-json序列化的Scala案例类.我遇到的问题是,我不知道如何调用extractOpt[A]下面的泛型方法方法:
someString:String = {...}
JsonParser.parse(someString).extractOpt[A]
Run Code Online (Sandbox Code Playgroud)
类型[A]将取决于元数据,例如类名,[A]但对于我的生活,我无法弄清楚如何使用反射进行调用.在c#中我只能extractOpt[A]使用反射设置调用的泛型类型.我担心我的问题与Java类型擦除有关.
我将会有很多案例类,所以我真的想避免从{metadata} - > classOf []创建某种手工制作的地图.我可以完全控制与之关联的元数据someString.
如果它有助于理解为什么我有这个问题,我正在实现事件采购,而我所有的[A]类型将成为持久化事件.任何想法我能做什么?