如何将WebSocket返回的ID[type,json]格式数据转为KVP<string,string>
解析WebSocket接收的ID[type,json]格式数据
我从WebSocket收到的数据格式为ID[type,json],包含消息ID、JSON类型标识字符串、序列化后的JSON内容三部分。示例如下:
42["login",{ "requestId":null,"loginToken":"fwadff","type":"display","clientGroup":null,"features":[],"force":true}]
其中42是消息ID,login是JSON类型标识,后半段是具体JSON内容。JSON结构会动态变化,需要根据类型标识确定反序列化方式。直接用Split(',')会拆分JSON内部的逗号导致解析错误,我写了一段初步代码,但想找更简便的方法将数据转为KeyValuePair<string, string>或KeyValuePair<string, dynamic>:
string test = "42[\"login\",{ \"requestId\":null,\"loginToken\":\"fwadff\",\"type\":\"display\",\"clientGroup\":null,\"features\":[],\"force\":true}]"; // 从字符串提取键值对 int startIndex = test.IndexOf('['); int endIndex = test.LastIndexOf(']'); if (startIndex > -1 && endIndex > -1) { // 提取键值对部分 string kvp = test.Substring(startIndex, ((endIndex - startIndex)+1)); string id = test.Substring(0, startIndex); Console.WriteLine(kvp); var result = kvp.Trim('[', ']') .Split(new[] { ',' }, 2); }
推荐解决方案:利用JSON解析库处理
这类格式本质是前缀ID + JSON数组,直接用专业JSON解析库处理最可靠,能避免手动拆分的各种边缘问题。
方案1:使用Newtonsoft.Json(Json.NET)
using Newtonsoft.Json; using Newtonsoft.Json.Linq; string test = "42[\"login\",{ \"requestId\":null,\"loginToken\":\"fwadff\",\"type\":\"display\",\"clientGroup\":null,\"features\":[],\"force\":true}]"; // 分离消息ID和JSON数组部分 int bracketPos = test.IndexOf('['); string messageId = test.Substring(0, bracketPos); string arrayJson = test.Substring(bracketPos); // 解析JSON数组 JArray array = JsonConvert.DeserializeObject<JArray>(arrayJson); string type = array[0].Value<string>(); dynamic content = array[1]; // 如需强类型,可根据type反序列化为对应实体类 // 生成目标键值对 var kvp = new KeyValuePair<string, dynamic>(type, content); // 验证输出 Console.WriteLine($"消息ID: {messageId}"); Console.WriteLine($"类型标识: {kvp.Key}"); Console.WriteLine($"JSON内容: {JsonConvert.SerializeObject(kvp.Value)}");
方案2:使用.NET内置System.Text.Json(.NET Core/.NET 5+)
using System.Text.Json; string test = "42[\"login\",{ \"requestId\":null,\"loginToken\":\"fwadff\",\"type\":\"display\",\"clientGroup\":null,\"features\":[],\"force\":true}]"; int bracketPos = test.IndexOf('['); string messageId = test.Substring(0, bracketPos); string arrayJson = test.Substring(bracketPos); // 解析JSON数组 using JsonDocument doc = JsonDocument.Parse(arrayJson); JsonElement root = doc.RootElement; string type = root[0].GetString(); JsonElement content = root[1]; // 生成目标键值对(用JsonElement替代dynamic,也可按需反序列化为具体类型) var kvp = new KeyValuePair<string, JsonElement>(type, content); // 验证输出 Console.WriteLine($"消息ID: {messageId}"); Console.WriteLine($"类型标识: {kvp.Key}"); Console.WriteLine($"JSON内容: {content.GetRawText()}");
为什么不推荐手动拆分?
手动拆分字符串无法处理JSON内容中的特殊场景(比如字符串包含逗号、转义引号等),而JSON解析库能正确处理所有合法JSON格式,代码可读性和稳定性都远高于手动拼接拆分。
内容的提问来源于stack exchange,提问作者Cainnech
相关产品推荐
相关产品推荐

