将 json 反序列化为不同程序集和命名空间的字典

Rav*_*vio 5 .net c# json json.net asp.net-core

我在将来自不同项目 api 的 json 映射到我的模型 Customer 时遇到问题 public Dictionary<string, List<CustomerAddress>> CustomerAddress{ get; set; }

我为我的 json 设置定义了一个 ISerializationBinder,如下所示

public class KnownTypesBinder : ISerializationBinder
{
    public IList<Type> KnownTypes { get; set; }

    public string TypeFormat { get; private set; }

    public KnownTypesBinder(string typeFormat)
    {
        TypeFormat = typeFormat;
    }
    public void BindToName(Type serializedType, out string assemblyName, out string typeName)
    {
        assemblyName = null;
        typeName = serializedType.Name;
    }

    public Type BindToType(string assemblyName, string typeName)
    {                 
             resolvedTypeName = string.Format(TypeFormat, typeName.Split('.').Last());              

        return Type.GetType(resolvedTypeName, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用上述绑定器的反序列化代码如下:

var settings = new JsonSerializerSettings
{
    TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple,
    TypeNameHandling = TypeNameHandling.All,
    
    SerializationBinder = new KnownTypesBinder("CustomerWeb.API.Models.{0}, CustomerWeb.API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
    {
        KnownTypes = new List<Type>
        {
            typeof(CustomerProducts),                                     
            typeof(Dictionary<string,Customer>),
        }
    }
};

var jsonToObject = JsonConvert.DeserializeObject<Customer>(strStream, settings)
Run Code Online (Sandbox Code Playgroud)

我的 Customer 类的其他属性是 bing 映射的。只有字典类型失败。有人可以指导我吗?

错误研究:以下是我的项目字典的类型

System.Collections.Generic.Dictionary 2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Collections.Generic.List1[[CustomerWeb.API.Models.CustomerAddress, CustomerWeb.API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e

下面的一个是来自另一个 api 的 Json 对象的类型

System.Collections.Generic.Dictionary 2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.List1[[Customer.CustomerWeb.Common.CustomerAddress, Customer.CustomerWeb.Common.V4, Version=9.0.0.0, Culture=neutral, PublicKeyToken=f291d57f641e84e4]], mscorlib, Version=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]

我可以识别不匹配但如何处理它。我无法控制来自不同项目的 api 的 Json 序列化设置。

示例 Json :

{
"$id": "1",
"$type": "Customer.CustomerWeb.Common.CustomerRecommendation, Customer.CustomerWeb.Common.V4, Version=9.0.0.0, Culture=neutral, PublicKeyToken=f291d57f641e84e4",
"Addr1": "Cust1",
"CustomerAddress": {
    "$id": "41",
    "$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.List`1[[Customer.CustomerWeb.Common.CustomerAddress, Customer.CustomerWeb.Common.V4, Version=9.0.0.0, Culture=neutral, PublicKeyToken=f291d57f641e84e4]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    "Items": {
        "$id": "42",
        "$type": "System.Collections.Generic.List`1[[Customer.CustomerWeb.Common.CustomerAddress, Customer.CustomerWeb.Common.V4, Version=9.0.0.0, Culture=neutral, PublicKeyToken=f291d57f641e84e4]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
        "$values": [
            {
                "$id": "43",
                "$type": "Customer.CustomerWeb.Common.CustomerAddress, Customer.CustomerWeb.Common.V4, Version=9.0.0.0, Culture=neutral, PublicKeyToken=f291d57f641e84e4",
                "CustomerID": 268541064,
                "ApplicationID": 110296837,
                "ProductID": 1,
                "ProductCode": 1,
                "Amount": 1000.00000,
                "AmountPercent": 2.98,
                "AppliedValueType": 1,                                   
                "Id": 811760147,
                "RealId": 811760147,
                "DirtyProperties": {
                    "$id": "46",
                    "$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Drive.Framework.DirtyProperty, OriginationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=f291d57f641e84e4]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                },
                "IsDirty": false,
                "IsNew": false,
                "IsDeleted": false,
                "ModifiedDate": "2020-05-28T09:01:27.033",
                "CreatedDate": "2020-05-28T09:01:27.033",
                "ModifiedByID": 0,
                "CreatedByID": 0,
                "DeactivationDate": null,
                "ActivationDate": null,
                "SerializationTracking": null
            }
        ]
    },
    }
    }
Run Code Online (Sandbox Code Playgroud)