使用 Gson.tojson 转换嵌套列表

Converting a nested List in using Gson.tojson

我正在使用 Scala,但这也适用于 Java - 看来 Gson 在转换嵌套在 case class/within 另一个对象中的列表时遇到问题:

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可以提取和转换嵌套的内classes就好了,但是当一个Collection是嵌套的class时,好像就出问题了。有什么想法吗?

问题与大小写 类 或嵌套无关,而是与 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.

的答案中尝试一些

您可以使用 lift-json 模块从 case 类 中呈现 json 个字符串。这是一个非常易于使用的库,具有非常好的 DSL 来创建 JSON 字符串而不需要大小写 类。您可以在 Lift-Json Github 页面

找到更多相关信息