Ich bin mir nicht sicher, warum jemand noch nicht zu dieser Frage gefragt hat, aber ich versuche, nur einfache Arten eines bestimmten Objekts mit IContractResolver
Schnittstelle zu serialisieren. Ich möchte nicht wirklich jede Eigenschaft mit ShouldSerialize
Methode oder JsonDataAttribute
oder etwas Ähnliches markieren.Serialize nur einfache Typen mit Json.Net
Was habe ich wie folgt auf LinqPad bisher getan gezeigt
Einige Beispiel Klassen serialisiert
class Customer
{
public List<Order> Orders {get;set;}
public int CustomerId {get;set;}
public string[] Addresses {get;set;}
}
class Order
{
public int OrderId{get;set;}
public string Name {get;set;}
public int Amount {get;set;}
public Order PreviousOrder {get;set;}
}
Eine Erweiterung Methode alle Objekte
static class ExtensionMethods
{
public static string JsonSerialize (this object obj)
{
var settings = new JsonSerializerSettings();
settings.ContractResolver = new MyContractResolver();
settings.DefaultValueHandling = DefaultValueHandling.Ignore;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
return JsonConvert.SerializeObject(obj,settings);
}
}
serialisiert Meine benutzerdefinierte Vertragsauflösung Klasse
public class MyContractResolver: DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member,memberSerialization);
property.ShouldSerialize = instance => instance.GetType().IsPrimitive || instance.GetType() == typeof(string) || instance.GetType() == typeof(decimal);
return property;
}
}
und Main-Methode:
void Main()
{
var customer = new Customer
{
Orders = ProduceSomeOrders(),
Addresses = new string[] {"9450 S. Small Street Dr.","9521 Flintstone Dr. S"},
CustomerId = 1
};
var jsonOrder = customer.JsonSerialize();
jsonOrder.Dump();
}
Ich möchte nur Probentypen wie int
, double
, string
, decimal
, bool
usw. aber nicht Arrays, Sammlungen, benutzerdefinierte Objekte usw. serialisiert und es wird nur die erste Ebene, nicht die zweite oder mehrere Ebenen nach unten navigieren. Ich frage mich wirklich, warum es keine einfache Methode gibt, die das in Json.Net tut.
Dies ist der Ausgang, wenn ich diesen Code ausführen: (ein leeres json)
{}
ich eine Sache realisiert habe, wenn ich diesen Code ausführen, der erste member
Parameter übergeben in die CreateProperty
Methode ist das Hauptobjekt selbst, das in diesem Fall Customer
Instanz ist. Aber da dies für alle Arten von Typen funktioniert, möchte ich einfach nicht instance.GetType() == typeof(Customer)
oder etwas ähnliches in der Methode sagen. Die erwartete Ausgabe ist in diesem Fall nur CustomerId
.
Kennen Sie irgendeine anmutige Art, mit meinem Problem umzugehen?
Was ist das erwartete Ergebnis der Serialisierung? Basierend auf was ich gelesen habe sollte es nur CustomerID enthalten, ist das korrekt? – Patrick
@Patrick: Du hast Recht! – Tarik
In der JsonSerialize-Methode ist es möglich, die Eigenschaften der "Top-Instanz" zu iterieren, um seine untergeordneten Eigenschaften zu serialisieren, und sie dann irgendwie zu einer gültigen JSON-Zeichenfolge zu mischen? – Patrick