如何将双引号包裹的数组字符串转为数组?Android JSON请求适配
解决Android中Gson序列化数组变成字符串的问题
嘿,这个问题我之前在做Android接口请求时也踩过坑!本质原因是你把单独序列化列表得到的JSON字符串直接塞进了请求对象,导致最终生成的JSON里food字段变成了带引号的字符串,而不是接口需要的数组格式。
正确的做法:让Gson序列化整个请求实体类
最规范的方式是先定义对应请求结构的数据类,然后让Gson直接序列化整个对象,这样food字段会自动被序列化为数组:
- 定义请求相关的数据类:
import com.google.gson.annotations.SerializedName data class OrderRequest( @SerializedName("user_id") val userId: String, @SerializedName("restaurant_id") val restaurantId: String, @SerializedName("total_cost") val totalCost: String, @SerializedName("food") val foodItems: List<FoodItem> ) data class FoodItem( @SerializedName("food_item_id") val foodItemId: String )
- 构建请求对象并序列化:
// 假设listOfMenuIds是你存储菜品ID的列表(比如List<String>) val foodList = listOfMenuIds.map { FoodItem(it) } // 组装完整的请求对象 val orderRequest = OrderRequest( userId = "5665", restaurantId = "5", totalCost = "660", foodItems = foodList ) // 直接序列化整个请求对象 val gson = Gson() val requestJson = gson.toJson(orderRequest)
这样生成的requestJson就完全符合接口要求,food字段会是标准的JSON数组。
备选方案:手动构建JsonObject(适合动态字段场景)
如果因为某些原因不能使用数据类(比如请求字段是动态的),可以直接用Gson的JsonObject和JsonArray手动构建结构:
val gson = Gson() val requestObject = JsonObject() // 添加基础字段 requestObject.addProperty("user_id", "5665") requestObject.addProperty("restaurant_id", "5") requestObject.addProperty("total_cost", "660") // 构建food对应的JsonArray val foodArray = JsonArray() listOfMenuIds.forEach { menuId -> val foodItem = JsonObject() foodItem.addProperty("food_item_id", menuId) foodArray.add(foodItem) } // 将数组添加到请求对象中 requestObject.add("food", foodArray) // 最终转成JSON字符串 val requestJson = gson.toJson(requestObject)
为什么之前的做法不对?
当你调用gson.toJson(listOfMenuIds)时,得到的是一个字符串形式的JSON数组(比如"[{\"food_item_id\":\"50\"}, {\"food_item_id\":\"51\"}]"),如果把这个字符串直接赋值给请求对象的food字段,Gson在序列化整个请求时会把它当成普通字符串处理,最终就会在JSON里多一层引号,变成不符合要求的格式。
内容的提问来源于stack exchange,提问作者Wani
相关产品推荐
相关产品推荐

