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 id
vorbei, 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;
}
}
Eine Möglichkeit wäre, eine benutzerdefinierte 'JsonConverter' zu implementieren, die bei der Erstellung fügt auch die ID. –
Sie können die Eigenschaften schreibgeschützt und dennoch deserialisierbar machen, indem Sie sie zu 'private set' machen und ein Attribut' [JsonProperty] 'hinzufügen. –
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? –