Wie zu sagen, JSON.NET Deserialisieren JArray, um eine Liste<object> wenn der Objekt-Typ ist?
Wir haben die folgenden Klasse:
class Foo
{
public object Any;
}
Dieser Klasse akzeptiert alles, was im Bereich Any
.
Wenn ich rufe:
JsonConvert.DeserializeObject<Foo>("{any: 5}")
Any
enthält System.Int64
.
Jedoch, wenn ich rufe:
JsonConvert.DeserializeObject<Foo>("{any: [5]}")
Any
enthält Newtonsoft.Json.Linq.JArray
.
Konfigurieren JSON.NET so dass in diesem Fall Any
enthalten würde List<object>
?
KLARSTELLUNG:
Es könnte alles sein, die ich anrufen kann:
JsonConvert.DeserializeObject<Foo>("{any: 'c'}")
oder
JsonConvert.DeserializeObject<Foo>("{any: ['c', 5]}")
Weitere Klarstellung:
Möchte ich sagen, irgendwie JSON.NET (vielleicht mit JsonSerializerSettings):
Wenn Sie auf
object
- und JSON ein array enthält, Deserialisieren, dass
zu (zum Beispiel)List<object>
.
- möglich, Duplikat der Wie behandeln sowohl ein einzelnes Element und ein array für die gleiche Eigenschaft mit JSON.net
- siehe update
- Wenn
Any
ist nur5
und nicht[5]
haben, möchten Sie es einList<System.Int64>
auch? - Nein, denn es könnten [5, 'x']. (Daher habe ich
object
es.) - Sie können markieren Sie einen Konstruktor mit JsonConstructorAttribute (newtonsoft.com/json/help/html/...), die sagen, dass der Konstruktor wird bei der Deserialisierung des Objekts. Sie konnte dann einer Logik, die Sie da rein wollen. Würde, dass die Arbeit für Sie?
- Ich kann nicht kommentieren, die bestimmte Klassen, die ich brauche, um anzugeben, dass als 'global' - Verhalten. Siehe "weitere Klärung".
- Ich hatte den Verdacht, dass das möglicherweise der Fall sein. Es gibt überladungen der DeserializeObject, die nehmen JsonConverters, die könnten tun, was Sie wollen, aber ich habe Sie nicht genutzt. Im Allgemeinen JsonConverters überschreiben lese - /schreib-Verhalten, so sollte in der Lage sein, das zu tun, was Sie wollen, aber ich kann Ihnen nicht sagen, viel mehr, wie man Sie benutzt. (Entschuldigt, wenn Sie bereits überprüft, ob diese überlast wird Ihnen helfen) stackoverflow.com/questions/2254872/... von Interesse sein können, auf dieses Thema (vielleicht sogar ein Duplikat)
- Ich habe bereits geschrieben, paar-Wandler, allerdings weiß ich nicht, wie Sie angeben, dass es sollte aufgerufen werden, nur, wenn das JSON ein array enthält (und Mitglied ist-Objekt). Oder wie man fallback auf die default-Verhalten, wenn JSON enthält (zum Beispiel) eine Zeichenfolge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Antwort ist vermutlich hier
Ihre
[5]
ist ein array. Alles, was Sie tun müssen, ist, um Sie zu wirken, um eine Liste.Könnten Sie auch Ihre eigenen erstellen-Wandler, wie hier beschrieben
Derzeit habe ich verspottet die folgende Lösung:
Problem dieser Lösung ist, dass es behandeln müssen, die andere Arten als gut. Es könnte scheitern, wenn die Leser.TokenType ist weder
StartArray
nochStartObject
und Leser.ValueType ist null. Hoffentlich wird jemand eine bessere Lösung.Array
Fall jedem anderen Fall Sie nur das Objekt zurückgeben, wie es ist und JSON wird den rest erledigen. (Es war in der Lage zu verwalten, die Typen ohne a-Wandler, richtig?)JToken.Load(reader).ToObject<object>()
?;[1, [5, 3]]
oder[1, {bar: [4]}]
). Das gleiche problem hat derzeit die Lösung über.if
?null
imValue
, weil es da sein sollte oder nicht. Aber man kann einfach ignorieren, dass, wenn. Problem ist, dassJToken.Load(reader).ToObject<List<object>>()
nicht verarbeiten verschachtelte array-und vielleicht auch anderen JsonConvertors, die konfiguriert sind.Ich denke, man könnte dies mit einer JsonConverter. Der converter unten wandelt JArrays, um Listen von Objekten, bei der jedes Feld ist ein JArray und fällt zurück auf das Standardverhalten für alle in allen anderen Fällen. Basierend auf Ihrer Beschreibung, das ist genau das, was Sie suchen. Ich vermute, der code könnte verbessert werden, aber dies sollte Euch den Weg zu einer Lösung:
Verwendung:
Foo
ist nur ein Beispiel. Ich kann nicht führen Sie die festverdrahtung der Konverter für eine bestimmte Klasse (Foo
) und das Eigentum (Any
).