Ich habe eine Json-Saite wie unten
{
"JsonValues":{
"id": "MyID",
"values": {
"value1":{
"id": "100",
"diaplayName": "MyValue1"
},
"value2":{
"id": "200",
"diaplayName": "MyValue2"
}
}
}
}
Ich möchte Json-String in untergeordnete Klassen konvertieren
class ValueSet
{
[JsonProperty("id")]
public string id
{
get;
set;
}
[JsonProperty("values")]
public List<Value> values
{
get;
set;
}
}
class Value
{
public string id
{
get;
set;
}
public string DiaplayName
{
get;
set;
}
}
Mein Deserialisierungscode lautet
JavaScriptSerializer js = new JavaScriptSerializer();
StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
string jsonString = sr.ReadToEnd();
var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
Aber ich bekomme nach der Serialisierung Nullwerte. Wie kann ich das lösen?
Wie bereits erwähnt, erhalten Sie nicht die erwarteten Ergebnisse, weil Ihr JSON nicht mit der Klassenstruktur übereinstimmt, in die Sie zu deserialisieren versuchen. Sie müssen entweder Ihre JSON oder Ihre Klassen ändern. Da andere bereits gezeigt haben, wie man die JSON ändert, gehe ich hier umgekehrt vor.
Um mit dem in Ihrer Frage geposteten JSON übereinzustimmen, sollten Ihre Klassen wie folgt definiert sein. Beachten Sie, dass ich folgende Änderungen vorgenommen habe:
Wrapper
-Klasse hinzugefügt, die dem äußeren Objekt in Ihrem JSON entspricht.Values
-Eigenschaft der ValueSet
-Klasse von einem List<Value>
in einen Dictionary<string, Value>
geändert, da die values
-Eigenschaft in Ihrem JSON ein Objekt und kein Array enthält.[JsonProperty]
-Attribute hinzugefügt, um den Eigenschaftsnamen in Ihren JSON-Objekten zu entsprechen.Klassendefinitionen:
class Wrapper
{
[JsonProperty("JsonValues")]
public ValueSet ValueSet { get; set; }
}
class ValueSet
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("values")]
public Dictionary<string, Value> Values { get; set; }
}
class Value
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("diaplayName")]
public string DisplayName { get; set; }
}
Sie müssen sich in die Wrapper
-Klasse deserialisieren, nicht in die ValueSet
-Klasse. Sie können dann die ValueSet
von der Wrapper
erhalten.
var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
Hier ist ein Arbeitsprogramm zur Demonstration:
class Program
{
static void Main(string[] args)
{
string jsonString = @"
{
""JsonValues"": {
""id"": ""MyID"",
""values"": {
""value1"": {
""id"": ""100"",
""diaplayName"": ""MyValue1""
},
""value2"": {
""id"": ""200"",
""diaplayName"": ""MyValue2""
}
}
}
}";
var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
Console.WriteLine("id: " + valueSet.Id);
foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
{
Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
}
}
}
Und hier ist die Ausgabe:
id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
Ich fand den obigen Link unglaublich hilfreich, da er meine C # -Klassen korrigierte, indem er sie aus der tatsächlich zurückgegebenen JSON generierte.
Dann rief ich an:
JsonConvert.DeserializeObject<RootObject>(jsonString);
und alles funktionierte wie erwartet.
Ihre Datenstruktur und Ihre JSON stimmen nicht überein.
Dein JSON ist folgendes:
{
"JsonValues":{
"id": "MyID",
...
}
}
Die Datenstruktur, mit der Sie versuchen, sie zu serialisieren, ist folgende:
class ValueSet
{
[JsonProperty("id")]
public string id
{
get;
set;
}
...
}
Sie überspringen einen Schritt: Ihr JSON ist eine Klasse mit einer Eigenschaft namens JsonValues
, die ein Objekt Ihrer ValueSet
-Datenstruktur als Wert hat.
In Ihrer Klasse ist Ihr JSON auch folgendes:
"values": { ... }
Ihre Datenstruktur lautet wie folgt:
[JsonProperty("values")]
public List<Value> values
{
get;
set;
}
Beachten Sie, dass { .. }
in JSON ein Objekt definiert, wobei [ .. ]
ein Array definiert. Entsprechend Ihrer JSON haben Sie also keine Menge von Werten, aber Sie haben ein one
values-Objekt mit den Eigenschaften value1
und value2
vom Typ Value
.
Da der Deserializer ein Array erwartet, aber stattdessen ein Objekt abruft, führt er das am wenigsten zerstörungsfreie (Exception) aus, was er tun könnte: überspringt den Wert. Ihre Eigenschaft values
behält ihren Standardwert: null
.
Wenn Sie können: Passen Sie Ihren JSON an. Folgendes würde zu Ihrer Datenstruktur passen und ist wahrscheinlich das, was Sie tatsächlich möchten:
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1"
}, {
"id": "200",
"diaplayName": "MyValue2"
}
]
}
Haben Sie überprüft, ob diese Zeile einwandfrei funktioniert und ob Ihre Zeichenfolge einen Wert enthält?
string jsonString = sr.ReadToEnd();
wenn ja, versuchen Sie diesen Code für die letzte Zeile:
ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
oder wenn du ein Array von json hast, kannst du die folgende Liste verwenden:
List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);
viel Glück
sie haben eine nicht übereinstimmende jSon-Zeichenfolge. Wenn Sie in eine Liste konvertieren möchten, probieren Sie dies
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1",
},
{
"id": "200",
"diaplayName": "MyValue2",
}
]
}
Das ist auch möglich:
using System.Web.Helpers;
var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);