You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:52:31