Verwenden Sie JsonConvert.DeserializeObject, wenn die Eingabezeichenfolge kein gültiges JSON ist und eine Zahl ist oder mit dieser beginnt

StackOverflow https://stackoverflow.com//questions/22015670

Frage

Ich möchte eine gute Lösung für die Deserialisierung einfacher Zeichenfolgen finden, die mit einer Zahl beginnen oder nur eine Zahl enthalten, und verstehen, warum es so wie jetzt nicht funktioniert.

Ich kann die Eingabezeichenfolgen nicht steuern, daher kann ich mich nicht darauf verlassen, dass es sich um gültiges JSON handelt, und im Moment überprüfe ich nur, ob es JSON ist, und wenn nicht, werde ich es in „[{}] einschließen. ", aber ich wollte sehen, ob es einen besseren Weg gibt.

So deserialisiere ich es:

JsonConvert.DeserializeObject<MyClass[]>(myString);

Meine Klasse hat zwei Eigenschaften:

[JsonProperty(PropertyName = "key")]
public string Key { get; set; }

[JsonProperty(PropertyName = "value")]
public string Value { get; set; }

Wenn die Eingabezeichenfolge nur „a“ oder „a2“ ist, wird eine Newtonsoft.Json.JsonException ausgelöst („Unerwartetes Zeichen beim Parsen des Werts gefunden:A.Pfad '', Zeile 0, Position 0."), was erwartet wird, jedoch lösen „2“ und „2a“ andere Fehler aus.Ich möchte für „2“ und „2a“ das gleiche Verhalten wie für „a“ und „a2“.

Ausnahme bei der Übergabe von „2“:

Newtonsoft.Json.JsonSerializationException : Error converting value 2 to type 'MyClass[]'. Path '', line 1, position 1.
System.ArgumentException : Could not cast or convert from System.Int64 to MyClass[].

Ausnahme bei der Übergabe von „2a“:

System.FormatException : Input string was not in a correct format.

Warum funktioniert es nicht, wenn die Zeichenfolge nur Zahlen enthält oder mit einer Zahl beginnt?Gibt es eine intelligentere Möglichkeit, dies zu beheben, als die Eingabezeichenfolge mit „[{}]“ zu umbrechen?

War es hilfreich?

Lösung

Ihr Problem ergibt sich aus dem JSON-Parser und dem, was Sie ihm übergeben.

2 ist ein gültiger Wert, zum Beispiel Imagine JsonConvert.DeserializeObject<int>('2');

Aber a2 ist nicht so, da es wahrscheinlich als unvollständiger Bezeichner oder Eigenschaft angesehen wird, die außerhalb eines Objektliterals nicht existieren kann.Es handelt sich nicht um eine Zeichenfolge, da es keine einschließenden Anführungszeichen enthält.

Sie versuchen im Grunde, den JSON-Parser dazu zu bringen, ungültiges JSON zu analysieren, was natürlich nicht gelingt.

In Ihrem Fall würde ich tatsächlich so etwas tun:

MyClass cls = null;

if (json.StartsWith("{")) {
    cls = JsonConvert.DeserializeObject<MyClass>(json);
} else {
    cls = new MyClass() {
        Key = json
    };
}

Dies prüft auf {} mit welchen Objekten beginnen/enden sollen.Wenn wir einen finden { Wir können davon ausgehen, dass es sich um ein Objekt handelt, und deserialisieren. Wenn nicht, erstellen wir manuell eine Instanz Ihrer Klasse und geben den Wert ein.

Ich gehe hier natürlich von einigen Annahmen aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top