Unity C#如何按指定格式生成嵌套结构JSON数据
问题原因
- 缺少外层请求结构定义:你当前只序列化了内层玩家数据类,没有封装接口要求的
table固定字段和data嵌套层级,所以输出是平铺结构 - 字段类型不匹配:目标JSON要求
character为字符串类型(如"alice"),你当前定义为int类型,序列化后会输出数字值 - 字段值未做映射:本地存储的性别、角色是数字ID,需要转换成接口要求的字符串值再赋值
修复方案
- 给所有需要JsonUtility序列化的自定义类添加
[System.Serializable]特性,否则序列化会丢失字段 - 修正
PlayerData类中character字段的类型为string - 新增外层请求包装类,固定写入
table = "userdata",同时定义PlayerData类型的data字段承接内层数据 - 赋值时把本地存储的数字ID(角色、性别)映射成接口要求的字符串值
- 序列化时传入外层包装类实例,即可生成符合嵌套要求的JSON
修正后可直接运行的代码
using System.Collections; using UnityEngine; using UnityEngine.Networking; [System.Serializable] public class PlayerData { public string walletaddress; public string name; public string gender; public string character; } [System.Serializable] public class UserSubmitRequest { public string table = "userdata"; public PlayerData data; } public class DataSubmitter : MonoBehaviour { private string playerNamePrefKey = "PlayerName"; // 替换为你项目实际的玩家名存储key public IEnumerator POST() { string url = "xyz"; PlayerData playerData = new PlayerData(); // 角色ID转字符串映射,根据你项目实际的ID对应关系修改 int avatarId = PlayerPrefs.GetInt("PlayerAvatar"); playerData.character = avatarId switch { 1 => "alice", // 其他角色映射自行补充 _ => "alice" }; // 性别ID转字符串映射,根据你项目实际存储规则修改 int genderCode = PlayerPrefs.GetInt("PlayerGender", 0); playerData.gender = genderCode == 1 ? "male" : "female"; playerData.name = PlayerPrefs.GetString(playerNamePrefKey); // 替换为你实际的钱包地址读取逻辑,不要写死测试值 playerData.walletaddress = PlayerPrefs.GetString("Account", ""); UserSubmitRequest submitData = new UserSubmitRequest { data = playerData }; string jsonContent = JsonUtility.ToJson(submitData); Debug.Log($"生成的请求JSON:{jsonContent}"); using (UnityWebRequest request = new UnityWebRequest(url, "POST")) { byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonContent); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); request.SetRequestHeader("Accept", "application/json"); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log("Sent Data Successfully"); } else { Debug.Log($"Data not Sent, error: {request.error}"); } } } }
序列化后输出的JSON结构会完全匹配要求:
{"table":"userdata","data":{"walletaddress":"实际钱包地址","character":"alice","gender":"male","name":"test_joe"}}
内容的提问来源于stack exchange,提问作者BLACK GOKU
相关产品推荐
相关产品推荐

