Erkennen, wenn die deserialisierte Objekt fehlt, ist ein Feld mit der Klasse in JsonConvert Json.NET
Ich versuche zu Deserialisieren einige JSON-Objekte mit Json.NET. Ich habe festgestellt, jedoch, dass, wenn ich ein Objekt Deserialisieren, die nicht den Eigenschaften ich bin auf der Suche nach, dass kein Fehler ausgegeben wird, aber ein default-Wert zurückgegeben, für die Eigenschaften, wenn ich auf Sie zugreifen. Es ist wichtig, dass ich in der Lage bin, zu erkennen, Wann habe ich deserialisiert die falsche Art von Objekt. Beispiel-code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Json_Fail_Test
{
class Program
{
[JsonObject(MemberSerialization.OptOut)]
private class MyJsonObjView
{
[JsonProperty("MyJsonInt")]
public int MyJsonInt { get; set; }
}
const string correctData = @"
{
'MyJsonInt': 42
}";
const string wrongData = @"
{
'SomeOtherProperty': 'fbe8c20b'
}";
static void Main(string[] args)
{
var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData);
System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString());
var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData);
System.Console.Out.WriteLine(badObj.MyJsonInt.ToString());
}
}
}
Die Ausgabe dieses Programms ist:
42
0
Ich würde lieber eine exception geworfen werden nicht schweigend. Kurz gibt es eine Möglichkeit zu erkennen, ob die Serialisierung nicht einen parameter?
Ich weiß, ich kann die Daten analysieren mit einem Json-Objekt und überprüfen Sie, ob der parameter mit key value lookup-aber die Codebasis, die ich in verwendet die Muster vor, und ich möchte zu halten, konsistent, wenn es möglich ist.
InformationsquelleAutor DubiousPusher | 2014-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Json.Net serializer hat eine
MissingMemberHandling
Einstellung, die Sie festlegen können, umError
. (Die Standardeinstellung istIgnore
.) Dadurch wird der serializer zu werfenJsonSerializationException
bei der Deserialisierung, wenn es auf eine JSON-Eigenschaft, für die es keine entsprechende Eigenschaft in der Ziel-Klasse.Ergebnis:
Danke. Es hat mir sehr geholfen. Hast du den link zu teilen, weiter zu studieren, JSON-parsing, das fehlende esp und Null value handling-Probleme?
Ich habe ein ziemlich ähnliches problem. Wenn ein Mitglied der Ziel-Klasse fehlt in der JSON, das deserializer wird, ignorieren Sie es und stellen Sie es auf null. Auch wenn die MissingMember Einstellung auf Fehler.
Schon eine Lösung gefunden. Verwendet Attribute, um zu Kennzeichnen, dass meine Mitglieder, wie erforderlich.
Das Beispiel wäre: deserialisiert eine leere json-Zeichenfolge "{}" in jeder Art. Es werden alle Werte in den Typ "null". Aber ich will eine Ausnahme, wenn der Typ nicht entsprechen json.
InformationsquelleAutor Brian Rogers
Fügen Sie einfach
[JsonProperty(Required = Required.Always)]
auf die gewünschten Eigenschaften und es wird mit Ausnahme auslösen, wenn die Eigenschaft nicht während der Deserialisierung.InformationsquelleAutor JerryGoyal
Setzen Sie das folgende Attribut auf die erforderlichen Eigenschaften:
Wenn das Mitglied nicht vorhanden ist, wird es werfen eine Newtonsoft.Json.JsonSerializationException.
Als Brian unten vorgeschlagen, müssen Sie auch dieses Attribut auf Klasse:
Diese Lösung wird nur funktionieren, wenn man
[DataContract]
auf Ihre Klasse UND Sie haben NICHT[JsonProperty]
auf das Mitglied. (JsonProperty
überschreibtDataMember
.) Sie könnte jedoch möglich, dieRequired
parameter auf die[JsonProperty]
AttributRequired.Always
dasselbe erreichen.Ah guter Punkt Brian. Tut mir Leid, dass Zweifelhafte.
InformationsquelleAutor Adam Modlin
Einfach definieren Sie Ihre Mitglieder in Ihrer definition der Klasse mit einem Fragezeichen '?'
int?
:Wenn es nicht initialisiert ist, wird es nur
null
werden, sonst wird es ein Gültiger Wert. Dies ermöglicht Ihnen, die Einstellungen optional und bewerten Sie Sie auf einer pro-Einstellung basis.InformationsquelleAutor isgoed