Unity C#游戏中如何解析服务器返回的换行分隔JSON?
解析换行分隔JSON(NDJSON)的Unity C#方案
当然可以!在Unity开发中处理这种换行分隔的JSON(也就是NDJSON格式)非常常见,我给你分享两种实用的实现方式,都是项目里验证过的:
1. 使用Unity内置的JsonUtility解析
首先你需要先定义一个和JSON结构匹配的C#类:
[System.Serializable] public class PlayerGameState { public string gamestate; public int score; public string compare; public string compitPosition; // 注意字段名要和JSON里的完全一致 }
然后处理服务器返回的NDJSON字符串:
public void ParseNDJSON(string ndjsonResponse) { // 按换行符分割字符串,兼容Windows(\r\n)和Linux(\n)的换行格式 string[] jsonLines = ndjsonResponse.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); foreach (string jsonLine in jsonLines) { try { // 逐个解析每行的JSON对象 PlayerGameState state = JsonUtility.FromJson<PlayerGameState>(jsonLine); // 这里就可以使用解析后的state对象了,比如打印测试 Debug.Log($"游戏状态:{state.gamestate},分数:{state.score},排名:{state.compitPosition}"); } catch (System.Exception e) { Debug.LogError($"解析JSON行失败:{jsonLine},错误信息:{e.Message}"); } } }
2. 使用Newtonsoft.Json(更灵活的方案)
如果你的项目里已经引入了Newtonsoft.Json(可以通过Unity Package Manager安装com.unity.nuget.newtonsoft-json),这种方式对复杂JSON的支持更好:
先定义实体类(可以用JsonProperty映射字段,就算字段名大小写不一致也能处理):
public class PlayerGameState { [JsonProperty("gamestate")] public string GameState { get; set; } [JsonProperty("score")] public int Score { get; set; } [JsonProperty("compare")] public string Compare { get; set; } [JsonProperty("compitPosition")] public string CompetitionPosition { get; set; } }
然后编写解析代码:
using Newtonsoft.Json; public void ParseNDJSONWithNewtonsoft(string ndjsonResponse) { string[] jsonLines = ndjsonResponse.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); foreach (string jsonLine in jsonLines) { try { PlayerGameState state = JsonConvert.DeserializeObject<PlayerGameState>(jsonLine); Debug.Log($"游戏状态:{state.GameState},分数:{state.Score},排名:{state.CompetitionPosition}"); } catch (JsonException e) { Debug.LogError($"解析JSON行失败:{jsonLine},错误信息:{e.Message}"); } } }
注意事项
- 记得处理空行:用
StringSplitOptions.RemoveEmptyEntries可以自动过滤掉分割后产生的空字符串,避免解析错误 - 异常捕获:服务器返回的内容可能存在格式错误,加上异常处理可以防止程序崩溃
- 如果是从网络获取NDJSON,建议在协程或者异步方法里处理,避免阻塞主线程
内容的提问来源于stack exchange,提问作者user3303274
相关产品推荐
相关产品推荐

