我使用的是Scala,但这也适用于Java - 看起来Gson在嵌套在案例类/其他对象中的List时遇到了问题:
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
,然后因为两者都只是字符串,手动将它们修改为toether,但这不太理想。阅读博客和用法等似乎Gson可以很好地提取和转换嵌套的内部类,但是当Collection是嵌套类时,它似乎有问题。有什么想法吗?
答案 0 :(得分:2)
问题与案例类或嵌套无关,而是与Gson中未正确支持的Scala集合类型有关。
为了证明这一点,我们将PersonCandy
更改为
case class PersonCandy(name:String, age:Int, candyList: java.util.List[Candy])
将candies
转换为Java List:
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的答案中尝试一些。
答案 1 :(得分:1)
您可以使用lift-json模块从案例类中呈现json字符串。它是一个非常好用的库,带有非常好的DSL来创建JSON字符串而无需案例类。您可以在Lift-Json Github页面
找到更多相关信息