【问题标题】:Converting a nested List in using Gson.tojson使用 Gson.tojson 转换嵌套列表
【发布时间】:2018-05-15 20:25:14
【问题描述】:

我正在使用 Scala,但这也适用于 Java - Gson 似乎在转换嵌套在案例类/另一个对象内的列表时遇到问题:

case class Candy(name:String, price:Double)
case class PersonCandy(name:String, age:Int, candyList:List[Candy])

val candies = List(Candy("M&M's", 1.99), Candy("Snickers", 1.59), Candy("Butterfinger", 2.33))
val personC = PersonCandy("Mark", 19, candies)

val pollAsJson = new Gson().toJson(personC)

REPL 显示生成的pollAsJson 如下:

pollAsJson: String = {"name":"Mark","age":19,"candyList":{}}

我的解决方法可能是转换嵌套的 candyList,转换 personC,然后由于两者都只是字符串,因此手动将它们破解,但这并不理想。阅读博客和用法等似乎Gson可以很好地提取和转换嵌套的内部类,但是当Collection是嵌套类时,它似乎有问题。有什么想法吗?

【问题讨论】:

    标签: scala gson to-json


    【解决方案1】:

    问题与案例类或嵌套无关,而是与 Gson 不正确支持的 Scala 集合类型有关。

    为了证明这一点,我们把PersonCandy改成

    case class PersonCandy(name:String, age:Int, candyList: java.util.List[Candy])
    

    并将candies 转换为Java 列表:

    import scala.collection.JavaConverters._
    val candies = List(/* same items */).asJava
    

    JSON 也可以:

    {"name":"Mark","age":19,"candyList":[{"name":"M\u0026M\u0027s","price":1.99},{"name":"Snickers","price":1.59},{"name":"Butterfinger","price":2.33}]}
    

    如果您尝试为原始 candies 列表生成 JSON,它将生成:

    {"head":{"name":"M\u0026M\u0027s","price":1.99},"tl":{}}
    

    这反映了列表的head :: tail 结构。

    Gson 是一个主要用于 Java 代码的库。

    对于 Scala,有多种选择。我建议从this question 的答案中尝试一些。

    【讨论】:

      【解决方案2】:

      您可以使用 lift-json 模块从案例类中呈现 json 字符串。这是一个非常易于使用的库,具有非常好的 DSL 来创建 JSON 字符串,而无需案例类。你可以在Lift-Json Github页面找到更多相关信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        相关资源
        最近更新 更多