2016-03-31 9 views
0

Ich habe so etwas wie:Klasse, die teilweise abbildet Json Typ

class ABC 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public int value { get; set; } 
} 

Und json wie {"name":"John","value":123}

Ich möchte diese json analysieren und eine ABC für einen bestimmten id Wert zu schaffen. Ich habe mich gefragt, ob ich das in zwei Schritten machen muss oder die id irgendwie passieren kann? Im Idealfall würden diese Felder nur gelesen werden, aber ich bin mir nicht sicher, ob JSON.net das erlaubt.

z.B. mit nur einer Codezeile ein Verfahren wie ABC getABC(int id, string json)

+0

Eine Möglichkeit wäre, eine benutzerdefinierte 'JsonConverter' zu implementieren, die bei der Erstellung fügt auch die ID. –

+1

Sie können die Eigenschaften schreibgeschützt und dennoch deserialisierbar machen, indem Sie sie zu 'private set' machen und ein Attribut' [JsonProperty] 'hinzufügen. –

+0

Ohne JSON.net überhaupt gut zu kennen, würde ich sagen, das klingt großartig. Könnten Sie es zu einer vollständigen Antwort erweitern @ YuvalItzchakov? –

Antwort

0

Es ist ein bisschen Code-Golfy, aber Sie wollen die Mitglieder des ABC nur lesbar machen, dann JSON in eine Instanz von ABC deserialisieren, während in einer bestimmten idvorbei, Sie tun können:

var abc = new JObject(new[] { new JProperty("id", id) }.Concat(JObject.Parse(json).Properties())).ToObject<ABC>(); 

die Klasse verwenden:

class ABC 
{ 
    readonly int m_id; 
    readonly string m_name; 
    readonly int m_value; 

    public ABC(int id, string name, int value) 
    { 
     this.m_id = id; 
     this.m_name = name; 
     this.m_value = value; 
    } 

    public int id { get { return m_id; } } 
    public string name { get { return m_name; } } 
    public int value { get { return m_value; } } 
} 

Dieser Vorteil der Tatsache Rechnung, dass, wenn ein Objekt als Dieser öffentliche parametrische Konstruktor wird von Json.NET aufgerufen, um das Objekt zu konstruieren und die Argumentnamen den JSON-Eigenschaftsnamen zuzuordnen. So können Sie die id in übergeben, indem Sie die JSON zu JObject analysieren, in der ID zusammenführen und dann zu Ihrer letzten Klasse deserialisieren.

var abc = JObject.Parse(json).WithProperty("id", id).ToObject<ABC>(); 

Mit der fließend-Extension-Methode:

Eine weniger Code-Golfy Lösung zu tun wäre,

public static class JsonExtensions 
{ 
    public static JObject WithProperty(this JObject obj, string name, JToken value) 
    { 
     obj = obj ?? new JObject(); 
     obj[name] = value; 
     return obj; 
    } 
} 
Verwandte Themen