简体   繁体   English

Scala JSON 将嵌套数组解析为案例类

[英]Scala JSON Parsing Nested Array into Case Class

I'm using the standard Scala json parsing and I am running into issues with the nested arrays.我正在使用标准的 Scala json 解析,但遇到了嵌套数组的问题。

Here is sample JSON:这是示例 JSON:

{
    "_id": "id_here",
    "_rev": "rev_here",
    "RandomHosts": [
        "randomhosts_1",
        "randomhosts_2",
        "randomhosts_3",
        "randomhosts_4"
    ],
    "FirstObject": {
        "Host": "ActualHost",
        "Port": 8888,
        "DB": 0,
        "WFMDB": 1,
        "ETLDB": 2,
        "HostListPrefix": "Dev1",
        "ExtraHostsBands": [
            {
                "Host": "dev2",
                "Port": 2222,
                "DB": 0,
                "WFMDB": 1,
                "ETLDB": 2,
                "HostListPrefix": "Dev2"
            },
            {
                "Host": "dev3",
                "Port": 3333,
                "DB": 0,
                "WFMDB": 1,
                "ETLDB": 3,
                "HostListPrefix": "Dev3"
            }
        ],
        "RandomObject":{}
    }
}
// I HAVE OTHER IMPORTS AS WELL
import scala.util.parsing.json._;

case class BandClass (
        Host: String,
        Port:Int,
        DB:Int,
        WFMDB:Int,
        ETLDB:Int,
        HostListPrefix:String
    );

var jsonString = "<myjson>";

val bandconfig = JSON.parseFull(jsonString);
// THIS WORKS PERFECT AND GIVES ME JOINED STRING
val random_hosts = bandconfig.get.asInstanceOf[Map[String, Any]]("RandomHosts").asInstanceOf[List[String]].mkString(",");

//THIS ALSO WORKS PERFECT AND GIVES ME HOST AND PORT
val firstObject = bandconfig.get.asInstanceOf[Map[String, Any]]("FirstObject").asInstanceOf[Map[String, Any]];
val firstObjectHost = firstObject("Host").asInstanceOf[String]
val firstObjectPort = firstObject("Port").asInstanceOf[Double].toInt

//THIS IS WHERE EVERYTHING FALLS APART
val extraBands = firstObject("ExtraHostBands").asInstanceOf[List[BandClass]]

//EVEN THIS DOESNT WORK
val extraBands2 = firstObject("ExtraHostBands").asInstanceOf[Map[String, Any]]

Caused by: java.lang.ClassCastException: scala.collection.immutable.HashMap$HashTrieMap cannot be cast to $BandClass引起:java.lang.ClassCastException:scala.collection.immutable.HashMap$HashTrieMap 不能转换为 $BandClass

I'm not sure how to force that nested json array into my case class.我不确定如何将嵌套的 json 数组强制到我的案例类中。 Id even settle for a map or seq or anything I could iterate over to get the host/ports out of the ExtraHostBand json objects. Id 甚至满足于 map 或 seq 或任何我可以迭代以从 ExtraHostBand json 对象中获取主机/端口的东西。

Can anyone point me in the correct direction to get that json array into case class?任何人都可以指出我正确的方向以将该 json 数组放入 case 类吗? I also have access to play-json but cant seem to figure that out either.我也可以访问 play-json 但似乎也无法弄清楚。

Ended up going to play-json and it worked really well.最终去玩 json 并且效果很好。 Here is a solution in case someone needs this in the future:这是一个解决方案,以防将来有人需要它:

import play.api.libs.json.Json;
import play.api.libs.json;
import play.api.libs.json.Writes;
import play.api.libs.json._;
import play.api.libs._;
import play.api.libs.functional.syntax._;
import play.api.libs.json.Reads._;


case class BandClass (
        Host: String,
        Port:Int,
        DB:Int,
        WFMDB:Int,
        ETLDB:Int,
        HostListPrefix:String
    )

    case class FirstObject (
        Host: String,
        Port:Int,
        DB:Int,
        WFMDB:Int,
        ETLDB:Int,
        HostListPrefix:String,
        ExtraHostsBands: List[BandClass]
    )

    case class RawConfig (
        _id: String,
        _rev: String,
        RandomHosts: List[String],
        FirstObject: FirstObject
    )

    implicit val bandClassFormat = Json.format[BandClass];
    implicit val firstObjectFormat = Json.format[FirstObject];
    implicit val rawConfigFormat = Json.format[RawConfig];


    val playJsonParse = Json.parse(<myjson>).as[RawConfig]; 
    println("playJSON ID " + playJsonParse._id)
    println("playJSON REV " + playJsonParse._rev)

    playJsonParse.FirstObject.ExtraHostBands.foreach
        {
            case(r) => {
                println("Host " + r.Host);
                println("Host Prefix " + r.HostListPrefix);
                println("ETLDB " + r.ETLDB);
            }
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM