无法将含abnCallback的JSON映射至.NET实体类的技术求助
解决JSONP格式数据反序列化问题
当API返回被abnCallback()包裹的JSONP格式数据时,直接用Newtonsoft.Json反序列化会失败——外层的函数调用不属于标准JSON结构,导致实体类映射匹配失败。以下是几种可行的解决方法:
方法1:手动剥离外层包裹
直接截取字符串中abnCallback(和)之间的有效JSON内容,再进行反序列化:
// 假设apiResponse是接口返回的完整字符串 string apiResponse = "abnCallback({\"YourProperty\":\"Value\"})"; // 剥离外层的abnCallback()包裹 string cleanJson = apiResponse.Substring("abnCallback(".Length, apiResponse.Length - "abnCallback(".Length - 1); // 反序列化为目标实体类 ABRPayloadSearchResults result = JsonConvert.DeserializeObject<ABRPayloadSearchResults>(cleanJson);
方法2:正则表达式提取有效JSON
如果担心返回字符串存在额外空格、换行等格式干扰,用正则表达式提取更稳妥:
using System.Text.RegularExpressions; string apiResponse = "abnCallback({\"YourProperty\":\"Value\"})"; // 匹配abnCallback(...)中的JSON内容(兼容括号前后的空格) Match match = Regex.Match(apiResponse, @"abnCallback\s*\((.*?)\)", RegexOptions.Singleline); if (match.Success) { string cleanJson = match.Groups[1].Value; ABRPayloadSearchResults result = JsonConvert.DeserializeObject<ABRPayloadSearchResults>(cleanJson); }
方法3:自定义JsonConverter统一处理
如果需要重复处理这类格式,可以编写自定义转换器,自动完成外层包裹的剥离:
public class ABRCallbackConverter : JsonConverter<ABRPayloadSearchResults> { public override ABRPayloadSearchResults ReadJson(JsonReader reader, Type objectType, ABRPayloadSearchResults existingValue, bool hasExistingValue, JsonSerializer serializer) { // 读取原始响应字符串 string rawContent = reader.Value.ToString(); // 剥离外层的abnCallback()包裹 string cleanJson = rawContent.TrimStart("abnCallback(".ToCharArray()) .TrimEnd(")".ToCharArray()); // 反序列化为目标实体 return JsonConvert.DeserializeObject<ABRPayloadSearchResults>(cleanJson); } public override void WriteJson(JsonWriter writer, ABRPayloadSearchResults value, JsonSerializer serializer) { // 如果需要序列化时重新添加abnCallback包裹,可在此实现 string json = JsonConvert.SerializeObject(value); writer.WriteValue($"abnCallback({json})"); } } // 使用转换器完成反序列化 ABRPayloadSearchResults result = JsonConvert.DeserializeObject<ABRPayloadSearchResults>(apiResponse, new ABRCallbackConverter());
内容的提问来源于stack exchange,提问作者Code Ratchet
相关产品推荐
相关产品推荐

