Ich habe eine JSON-Zeichenfolge z.JSON.NET Deserialize-Schnittstelle zum Attributnamen
{
"first_name": "Paul"
"company": {
"company_name": "Microsoft"
}
}
und meine Klasse ist in der folgenden Struktur
[DataContract]
class User {
[DataMember(Name = "first_name")]
public string FirstName { get; set; }
[DataMember(Name = "company")]
public ICompany Company { get; set; }
}
interface ICompany {
string CompanyName { get; set; }
}
[DataContract]
class Company : ICompany {
[DataMember(Name = "company_name")]
public string CompanyName { get; set; }
}
ich ein benutzerdefiniertes Auto-Resolver verwenden, die nur eine Implementierung einer Schnittstelle Autofac findet (von json.net Webseite gezogen)
public class AutofacContractResolver : DefaultContractResolver
{
private readonly IContainer _container;
public AutofacContractResolver(IContainer container)
{
_container = container;
}
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
// use Autofac to create types that have been registered with it
if (_container.IsRegistered(objectType))
{
contract.DefaultCreator =() => _container.Resolve(objectType);
}
return contract;
}
}
Ich deserialize dann die JSON-Zeichenfolge mit
User user = JsonConvert.DeserializeObject<User>(json, new JsonSerializerSettings
{
ContractResolver = _resolver,
});
Wenn ich jetzt den JSerialisiere, wird der Vorname in die FirstName-Eigenschaft serialisiert, aber der Firmenname nicht, es gibt nur null zurück. Wenn ich den TraceWriter benutze, gibt es an, dass er kein Mitglied namens company_name auf der ICompany-Schnittstelle finden kann (was offensichtlich nicht für die Objektklasse Company möglich ist).
Warum verwendet JSON.NET den DataMember-Namen nicht von der Objekt deserialisieren gegen? Da es über das Compnany-Objekt aus dem benutzerdefinierten Resolver weiß, erstellt es dieses Objekt aber nur ohne Werte innerhalb.
Wie bekomme ich es, die Implementierung der Schnittstelle und nicht die Schnittstelle selbst zu verwenden?
FYI, das ist nicht das ganze Objekt und ich kann nicht nur meine Eigenschaft in eine Klasse statt einer Schnittstelle ändern. Dies ist nur ein abgespecktes Beispiel dafür, was mit allen Schnittstellenobjekten geschieht.