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

DbGeography反序列化及Newtonsoft.Json版本冲突问题求助

问题分析与解决方案

你现在遇到了两个独立的问题:第一个是DbGeography类型的JSON序列化/反序列化逻辑问题,第二个是Newtonsoft.Json的程序集版本冲突问题。我们先解决最紧急的版本绑定错误,再修正转换器的逻辑缺陷。

1. Newtonsoft.Json版本不匹配错误(FileLoadException)

这个错误的核心原因是:你的服务端项目引用的Newtonsoft.Json版本,和ASP.NET Web API序列化响应时依赖的版本(错误日志里的10.0.0.0)不一致,导致.NET运行时无法正确绑定程序集。

解决方案:

  • 检查当前引用版本:右键服务端项目 → 管理NuGet程序包,查看Newtonsoft.Json的实际安装版本。
  • 添加程序集绑定重定向:在服务端项目的Web.config的<configuration>节点下加入以下配置,强制运行时将所有旧版本的Newtonsoft.Json重定向到你实际使用的版本:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
      <!-- 把oldVersion范围覆盖到你需要的版本,newVersion改成实际安装的版本号 -->
      <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.1.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
  • 更新Web API依赖包:如果你的Web API项目使用的是旧版Microsoft.AspNet.WebApi.Client,它可能绑定了特定版本的Json.NET。可以尝试更新这个NuGet包到最新稳定版,让它自动适配兼容的Json.NET版本。

2. DbGeography自定义转换器的逻辑问题

你写的DbGeographyConverter存在几个关键缺陷,即使解决了版本问题,序列化/反序列化仍会出错:

核心问题点:

  • CanConvert方法逻辑错误:你当前判断的是objectType是否可分配给string,但我们需要转换的是DbGeography类型,应该修改为:
public override bool CanConvert(Type objectType)
{
    return objectType == typeof(System.Data.Entity.Spatial.DbGeography);
}
  • 反序列化逻辑依赖固定JSON结构:你假设返回的JSON是{"Geography":{"WellKnownText":"..."}},但实际服务端返回的结构可能不同,需要根据真实的JSON格式调整解析逻辑。
  • 序列化方法未解决原问题:WriteJson直接调用默认序列化,还是会触发最初的WellKnownValue访问错误,需要自定义输出逻辑,比如直接序列化WellKnownText:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    var geography = value as System.Data.Entity.Spatial.DbGeography;
    if (geography != null)
    {
        // 直接输出WellKnownText字符串,避免序列化DbGeography内部属性
        serializer.Serialize(writer, geography.WellKnownValue.WellKnownText);
    }
    else
    {
        serializer.Serialize(writer, value);
    }
}

正确使用转换器:

  • 客户端反序列化时,需显式指定转换器:
IEnumerable<Event> events = JsonConvert.DeserializeObject<List<Event>>(content, new DbGeographyConverter());
  • 服务端序列化时,要在Web API配置中注册转换器:
// 在WebApiConfig.cs的Register方法中添加
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new DbGeographyConverter());

总结

  1. 优先解决Newtonsoft.Json的版本冲突问题,这是当前抛出错误的直接原因。
  2. 修正自定义转换器的逻辑,确保它能正确处理DbGeography的序列化和反序列化流程。
  3. 在客户端和服务端分别正确注册使用转换器,完成整个序列化链路的适配。

内容的提问来源于stack exchange,提问作者kostik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:13:52