我使用Newtonsoft JSON对对象进行序列化/反序列化。其中一个包含带有受保护的setter的数组,因为构造函数自行构建数组,并且仅操作成员。
可以毫无问题地对其进行序列化,但是当涉及反序列化时,该属性将被忽略,因为它不是公共的。我尝试过使用它的自定义转换器,也未调用,因为它不是公共的。
这是一个最小化的示例:
public static class TestCoordsDeserialization { private class Coords { public Double X { get; set; } public Double Y { get; set; } public Double Z { get; set; } public Double A { get; set; } } private class Engine { public string Text { get; set; } public int Id { get; set; } public Coords[] Outs { get; protected set; } public Engine() { this.Outs = new Coords[3]; for (int i = 0; i < this.Outs.Length; i++) { this.Outs[i] = new Coords(); } } } public static void Test() { Engine e = new Engine(); e.Id = 42; e.Text = "MyText"; e.Outs[0] = new Coords() { A = 0, X = 10, Y = 11, Z = 0 }; e.Outs[1] = new Coords() { A = 0, X = 20, Y = 22, Z = 0 }; e.Outs[2] = new Coords() { A = 0, X = 30, Y = 33, Z = 0 }; string json = JsonConvert.SerializeObject(e); Console.WriteLine(json); //{"Text":"MyText","Id":42,"Positions":{"Test":9,"Outs":[{"X":10.0,"Y":11.0,"Z":0.0,"A":0.0},{"X":20.0,"Y":22.0,"Z":0.0,"A":0.0},{"X":30.0,"Y":33.0,"Z":0.0,"A":0.0}]}} Engine r = JsonConvert.DeserializeObject<Engine>(json); double value = r.Outs[1].X; // should be '20.0' Console.WriteLine(value); Debugger.Break(); } }
我怎样才能value成为 20.0 ?
value
标记Outs与[JsonProperty]属性:
Outs
[JsonProperty]
private class Engine { public string Text { get; set; } public int Id { get; set; } [JsonProperty] // Causes the protected setter to be called on deserialization. public Coords[] Outs { get; protected set; } public Engine() { this.Outs = new Coords[3]; for (int i = 0; i < this.Outs.Length; i++) { this.Outs[i] = new Coords(); } } }