壞消息是,我猜你不能動態地做出來。好消息是,你可以自己處理反序列化並從那裏產生你的對象。
我想你這樣做是爲了得到一個更好的結構,但注意,你必須編寫自己的串行,如果你想獲得對象放回原來的結構。
我發現有兩個選項可以實現您試圖獲得的結果。談到Json.NET時,我並不贊成,實際上它對我來說是相當新穎的。
這裏來代碼:
class Program
{
static void Main(string[] args)
{
String json = "{ 'A': 1, 'B' : 2, 'C' : 3 }";
var classA = JsonConvert.DeserializeObject<MegaClass>(json,new AConverter());
var classA2 = JsonConvert.DeserializeObject<MegaClass2>(json);
}
public class MegaClass2
{
public int A { get; set; }
public SetOfVariables SetOfVariables1 { get; set; }
public MegaClass2()
{
_additionalData = new Dictionary<string, JToken>();
SetOfVariables1 = new SetOfVariables();
}
[JsonExtensionData]
private IDictionary<string, JToken> _additionalData;
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
int b = (int)_additionalData["B"];
int c = (int)_additionalData["C"];
SetOfVariables1.B = b;
SetOfVariables1.C = c;
}
}
public class MegaClass
{
public int A { get; set; }
public SetOfVariables SetOfVariables1 { get; set; }
}
public class SetOfVariables
{
public int B { get; set; }
public int C { get; set; }
}
public class AConverter : CustomCreationConverter<MegaClass>
{
public override MegaClass Create(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
dynamic cl = serializer.Deserialize(reader);
var classA = new MegaClass();
classA.A = cl.A;
var classB = new SetOfVariables();
classB.B = cl.B;
classB.C = cl.C;
classA.SetOfVariables1 = classB;
return classA;
}
}
}
因此,這裏的descritption: 第一個選項使用CustomCreationConverter。我們將對象反序列化爲其原始表示並從那裏創建一個新對象。
第二個選項似乎在反序列化後初始化我們的對象。 _additionalData由框架設置,我們只是用它來填充我們的對象。
我看到第一個選項用於根據提供的json創建不同的對象。 例如,如果你有一個類A和B類並且兩個延伸C類然後可以在重寫Create
方法哪個對象反序列化決定。
第一個選項靈感來自Json.NET documentation
爲什麼?你試圖取得什麼樣的好處?我的意思是,你*可以*做到這一點 - 例如,你可以使用自定義的'JsonConverter'來手動構建你想要的任何類,但是這是很多額外的工作,沒有明顯的好處(除非你能澄清你期望的好處? ) –
或者您可以創建超級類,並在之後應用一個映射器。但正如RB所說,你想在這裏做什麼? – Stormhashe