2016-04-10 6 views
0

zuordnen So habe ich die JSON unten, dass ich in Klassen deseralisieren wollen, damit ich damit arbeiten kann. Aber die Probleme ist, dass die beiden oberen Felder sind eine andere Art zu der ganze Restkann nicht herausfinden, wie diese JSON in C# Klassen

"items": { 
    "averageItemLevel": 718, 
    "averageItemLevelEquipped": 716, 
    "head": { ... }, 
    "chest": { ... }, 
    "feet": { ... }, 
    "hands": { ... } 
    } 

Wo ... ist eine der Item-Klasse unten, aber das Problem ist, dass zwei der Felder sind ints und der Rest sind Item, es gibt ungefähr 20 Felder insgesamt. Also, was ich tun möchte, ist, sie in eine Dictionary<string, Item> zu setzen, aber die 2 int-Felder hindern mich daran, es in diese zu deseralisieren. Ich verwende JavaScriptSerializer.Deserialize<T>(), um dies zu tun.

Ich könnte jedes Element wie seine eigene Klasse mit dem Namen des Elements als der Name der Klasse haben, aber ich finde, dass es sehr schlecht ist, so viel jedes Mal wiederholend, auch sehr schwer mit später seit ich zu arbeiten kann nicht über die Felder iterieren, wo ich eine Dictionary. Irgendeine Idee, wie ich das überwinden könnte?

public class Item 
{ 
    public ItemDetails itemDetails { get; set; } 
    public int id { get; set; } 
    public string name { get; set; } 
    public string icon { get; set; } 
    public int quality { get; set; } 
    public int itemLevel { get; set; } 
    public TooltipParams tooltipParams { get; set; } 
    public List<Stat> stats { get; set; } 
    public int armor { get; set; } 
    public string context { get; set; } 
    public List<int> bonusLists { get; set; } 
} 

Update: aus den Kommentaren ich mit dieser Lösung kam

JObject jsonObject = JObject.Parse(json); 

jsonObject["averageItemLevel"] = int.Parse(jsonObject["items"]["averageItemLevel"].ToString()); 
jsonObject["averageItemLevelEquipped"] = int.Parse(jsonObject["items"]["averageItemLevelEquipped"].ToString()); 
jsonObject["items"]["averageItemLevel"].Parent.Remove(); 
jsonObject["items"]["averageItemLevelEquipped"].Parent.Remove(); 

var finalJson = jsonObject.ToString(Newtonsoft.Json.Formatting.None); 
var character = _serializer.Deserialize<Character>(finalJson); 
character.progression.raids.RemoveAll(x => x.name != "My House"); 

return character 
+0

Wenn Sie die Klassenroute herunterfahren, gibt es Tools, die Sie einfach in den JSON einfügen und es generiert die Klassen für Sie. Hier ist ein solches Werkzeug: http://jsonutils.com/ – Nkosi

+0

@Nkosi Ja, ich bin mir dieser Art von Werkzeugen bewusst, so groß wie sie sind, werden sie einfach eine Klasse für jedes 'Item' machen, wie ich erwähnt habe, was es macht eher chaotisch und schwer mit den Daten zu arbeiten – Toxicable

+0

Ok ich verstehe. Sie könnten versuchen Dictionary 'und sehen, ob es die anderen komplexen Objekte als Wörterbücher sowie – Nkosi

Antwort

1

Wenn ich diese beiden Klassen fügen Sie Ihre JSON übereinstimmen kann ich die Objekte serialisiert und deserialisiert:

public class root 
{ 
    public Items items { get; set; } 
} 

public class Items 
{ 
    public int averageItemLevel { get; set; } 
    public int averageItemLevelEquipped { get; set; } 
    public Item head {get;set;} 
    public Item chest {get;set;} 
    public Item feet {get;set;} 
    public Item hands {get;set;} 
} 

Prüfstand mit dem WCF-Serialisierer:

var obj = new root(); 
obj.items = new Items 
{ 
    averageItemLevel = 42, 
    feet = new Item { armor = 4242 }, 
    chest = new Item { name = "super chest" } 
}; 

var ser = new DataContractJsonSerializer(typeof(root)); 

using (var ms = new MemoryStream()) 
{ 
    ser.WriteObject(ms, obj); 

    Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
    Console.WriteLine("and deserialize"); 

    ms.Position = 0; 
    var deserializeObject = (root) ser.ReadObject(ms); 

    Console.WriteLine(deserializeObject.items.feet.armor); 
} 

Und mit dem JavaScriptSerializer:

var jsser = new JavaScriptSerializer(); 
var json = jsser.Serialize(obj); 

Console.WriteLine(json); 
Console.WriteLine("and deserialize"); 

var djson = jsser.Deserialize<root>(json); 

Console.WriteLine(djson.items.feet.armor); 

Beide Serializer das gleiche Ergebnis für Ihre angegebene JSON.

Verwandte Themen