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)