如何在不定义类的情况下使用 moshi 创建复杂的 json?
Posted
技术标签:
【中文标题】如何在不定义类的情况下使用 moshi 创建复杂的 json?【英文标题】:How to create a complicate json using moshi without define the class? 【发布时间】:2018-07-11 09:48:27 【问题描述】:在 gson 中,我可以使用 JsonElement 来格式化复杂的 json,类似于(在 kotlin 中):
val objIDonotWantToDefine = JsonObject()
objIDonotWantToDefine.addProperty("objName", "objIDonotWantToDefine")
val playerJsonArray = JsonArray()
for ((name, age) in players)
val player = JsonObject()
player.addProperty("name", name)
player.addProperty("age", age)
playerJsonArray.add(player)
objIDonotWantToDefine.add("players", playerJsonArray)
val jsonStringIWant = GsonBuilder().create().toJson(objIDonotWantToDefine)
我知道我可以在 moshi 中使用 JsonWriter 来做到这一点。但是有没有简单的方法来做到这一点?
【问题讨论】:
使用普通的 java.util.Map 代替 JsonObject 和 java.util.List 代替 JsonArray。 @EricCochran 非常感谢!它对我有用! 【参考方案1】:感谢@Eric Cochran,我在这里发布了解决方案演示:
说你想像这样创建 json:
"team":
"bestPlayers": [
"name": "kobe",
"age": "20"
,
"name": "shaq",
"age": "30"
],
"name": "lakers",
"playerCount": 2
,
"age": 999,
"description": "hi, I'm a big nested json object"
然后你可以这样编码:
val myNestedObj : MutableMap<String, Any> = LinkedHashMap()
myNestedObj.put("description", "hi, I'm a big nested json object")
myNestedObj.put("age", 999)
val layer1Obj : MutableMap<String, Any> = LinkedHashMap()
layer1Obj.put("playerCount", 2)
layer1Obj.put("name", "lakers")
val playerJsonArray : MutableList<Map<String, String>> = ArrayList()
for ((name, age) in players)
val player : Map<String, String> = mapOf("name" to name, "age" to age)
playerJsonArray.add(player)
layer1Obj.put("bestPlayers", playerJsonArray)
myNestedObj["team"] = layer1Obj
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonIWant = moshi.adapter(Map::class.java).toJson(myNestedObj)
【讨论】:
以上是关于如何在不定义类的情况下使用 moshi 创建复杂的 json?的主要内容,如果未能解决你的问题,请参考以下文章
在不创建新类的情况下访问自定义 UITableViewCell 中的 UITextField?
使用 C++ 定义接口(在不丢失基类的所有重载运算符的情况下派生)
如何在不捐赠意图或使用快捷方式的情况下利用 Siri 创建自定义对象?