Formatet for "$type"
er officielt hardkodet til at inkludere CLR-navneområdet for det afsendende system. Så du kan enten:
-
Omdøb dine CLR-navneområder, så de matcher dem i det afsendende system, eller
-
Underklasser
DefaultSerializationBinder
og brug det til at omdøbe CLR-navneområdets navne under deserialisering ved at indstille det iJsonSerializerSettings.Binder
.
Følgende er et første snit til at gøre dette:
public class NamespaceMappingSerializationBinder : DefaultSerializationBinder
{
public string FromNamespace { get; set; }
public string ToNamespace { get; set; }
public override Type BindToType(string assemblyName, string typeName)
{
string fixedTypeName;
if (FromNamespace != null && ToNamespace != null)
{
fixedTypeName = typeName.Replace(FromNamespace, ToNamespace);
}
else
{
fixedTypeName = typeName;
}
var type = base.BindToType(assemblyName, fixedTypeName);
return type;
}
}
Når du derefter deserialiserer din JSON, skal du indstille Binder
i JsonSerializerSettings
sådan:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Typenavnsanalysen i ovenstående er ekstremt grov. Jeg fandt en meget smartere parser her:Hvordan parser man C# generiske typenavne?. Du skal muligvis også udvide det tilpassede Binder
at have en ordbog over kortlægninger.
På samme måde kan du tilsidesætte BindToName
, hvis du har brug for at omforme navneområdets navne ved serialisering og arbejder i .Net 4.0 eller nyere. .