开发Web API应用解析Telegram数据时遇JSON text字段解析问题求助
解决Telegram API中text字段多类型解析问题
Telegram返回的JSON数据里,text字段存在两种格式:要么是纯字符串,要么是包含text属性的对象数组。不用写自定义JSON转换器,这几种简便方法就能搞定:
方法1:用动态类型直接判断(Json.NET)
先把JSON解析成JToken,再根据类型提取文本:
var jsonObj = JObject.Parse(yourJsonString); var textToken = jsonObj["text"]; string finalText = string.Empty; if (textToken.Type == JTokenType.String) { finalText = textToken.ToString(); } else if (textToken.Type == JTokenType.Array) { // 拼接数组里所有对象的text内容 finalText = string.Join("", textToken.Select(item => item["text"].ToString())); }
方法2:用System.Text.Json的JsonElement处理
如果用.NET Core默认的System.Text.Json,用JsonElement判断值类型:
using var doc = JsonDocument.Parse(yourJsonString); var root = doc.RootElement; var textElement = root.GetProperty("text"); string finalText = string.Empty; if (textElement.ValueKind == JsonValueKind.String) { finalText = textElement.GetString(); } else if (textElement.ValueKind == JsonValueKind.Array) { var sb = new StringBuilder(); foreach (var item in textElement.EnumerateArray()) { sb.Append(item.GetProperty("text").GetString()); } finalText = sb.ToString(); }
方法3:定义兼容的强类型实体类(推荐)
如果想要强类型解析,可以定义一个兼容两种格式的实体类,通过辅助方法获取最终文本:
// System.Text.Json 版本,Json.NET 替换为 [JsonProperty] public class TelegramMessage { [JsonPropertyName("text")] public string Text { get; set; } [JsonPropertyName("text")] public List<TextSegment> TextSegments { get; set; } // 获取合并后的文本 public string GetFullText() { if (!string.IsNullOrEmpty(Text)) return Text; return TextSegments != null ? string.Join("", TextSegments.Select(s => s.Text)) : string.Empty; } } public class TextSegment { public string Type { get; set; } public string Text { get; set; } }
解析时JSON库会自动匹配对应类型,调用GetFullText()就能拿到统一的文本内容。
内容的提问来源于stack exchange,提问作者Red Star
相关产品推荐
相关产品推荐

