Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时根据json字符串的内容将其转换为不同的对象_Json_Web Services_Scala_Json4s - Fatal编程技术网

在运行时根据json字符串的内容将其转换为不同的对象

在运行时根据json字符串的内容将其转换为不同的对象,json,web-services,scala,json4s,Json,Web Services,Scala,Json4s,我正在调用一个返回JSON的web服务 该服务返回以下响应之一 案例1: JSON: [ {"name":"somevalue1", "key1":"value1", "key2":"value2"}, {"name":"somevalue1", "key1":"value1", "key2":"value2"}, {"name":"somevalue1", "key1":"value1", "key2":"value2"} ] {"name": "inval

我正在调用一个返回JSON的web服务

该服务返回以下响应之一

案例1:

JSON:

[ {"name":"somevalue1", "key1":"value1", "key2":"value2"}, 
        {"name":"somevalue1", "key1":"value1", "key2":"value2"},
        {"name":"somevalue1", "key1":"value1", "key2":"value2"} ]
{"name": "invalid-response"}
案例类别:

case class ValidResponse(name: String, key1: String, key2: String)
case class InvalidResponse(name:String) 
案例2:

JSON:

[ {"name":"somevalue1", "key1":"value1", "key2":"value2"}, 
        {"name":"somevalue1", "key1":"value1", "key2":"value2"},
        {"name":"somevalue1", "key1":"value1", "key2":"value2"} ]
{"name": "invalid-response"}
案例类别:

case class ValidResponse(name: String, key1: String, key2: String)
case class InvalidResponse(name:String) 
我使用json4s解析响应,如下所示:

val parsedRes = parse(responseJson)
val objs: List[ValidResponse] = j.extract[List[ValidResponse]]
在案例1中,如果响应字符串是json,则此操作有效。但是,在案例2中,如果响应字符串包含json,我会得到一个parsedException。
如何处理多种类型的响应

更好的方法是对两种类型的响应(有效和无效)使用一个公共类:

案例类响应(名称:String,键1:Option[String],键2:Option[String])

Play框架有一个很棒的JSON解析器。你可以利用这个。请注意,Scala项目不必是Play项目。您只需要导入库