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

无法将含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:15:37