后台
我只想保存和加载一些JSON作为字符串,起源于<LocalDate,Int>
的HashMap
问题所在
虽然我成功地从HashMap生成了JSON字符串,但我没有做相反的事情,从JSON字符串生成HashMap。
我所尝试的
这就是我转换为JSON字符串的方法:
val gson = Gson()
val type = object:TypeToken<Map<LocalDate, Int>>(){}.type
val map: HashMap<LocalDate, Int> = HashMap()
val today = LocalDate.now()
map[today] = 1
val jsonStr = gson.toJson(map, type) // example of what this has: "{"2024-01-01":1}"
字符串
我也可以用它来证明解析字符串是可行的:
val jsonObject = JSONObject(jsonStr)
型
并检查它的值:
瓦尔countForToday = jsonObject.getInt(today.toString())
然而,当我使用这个(在查看here之后):
var newMap: Map<LocalDate, Int> = gson.fromJson(jsonStr, object : TypeToken<Map<LocalDate, Int>>() {}.type)
型
我得到这个例外:
Method threw 'com.google.gson.JsonSyntaxException' exception.
IllegalStateException: Expected BEGIN_OBJECT but was STRING at line...
型
我尝试过,但都失败了,基于我从其他例子中看到的:
1.我尝试使用GsonBuilder().create()
而不是Gson()
,我认为这不重要,尽管Gson()
可能是一个可以在任何地方使用的单例,甚至可能是线程安全的。
1.使用Map
代替HashMap,使用Any
代替Int
,使用?
(可空)。所有各种组合我可以想到...
现在我使用这个解决方案,不使用Gson转换回HashMap:
val jsonObject = JSONObject(jsonStr)
val hashHap = HashMap<LocalDate, Int>()
jsonObject.keys().forEach { key: String ->
val date = LocalDate.parse(key)
val value = jsonObject.getInt(key)
hashHap[date] = value
}
型
这个可以,但我想知道为什么Gson失败了。
问题
这是怎么回事?为什么我不能做这个简单的转换回HashMap/Map(使用Gson)?
1条答案
按热度按时间vwkv1x7d1#
看起来你在转换
LocalDate
时遇到了问题。问题是GSON
似乎无法识别LocalDate
对象。你需要有一个自定义的Date序列化器和Date转换器。它看起来像这样:字符串
然后你就可以使用它了。下面是一个示例代码:
型
有关更多信息,请参阅this