7

In gson, I can use JsonElement to format a complicate json, something like(in 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)

I know i can do this using JsonWriter in moshi. But is there a easy way to do this?

Softcloud
  • 141
  • 1
  • 7

1 Answers1

0

Thanks to @Eric Cochran, and I post solution demo here:

say you wanna create json like this:

{
  "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"
}

then you can code like this:

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)
Eric Cochran
  • 8,414
  • 5
  • 50
  • 91
Softcloud
  • 141
  • 1
  • 7