是否有一种方法可以在反序列化过程中绕过根对象?

时间:2020-02-03 11:31:45

标签: c# json deserialization

我收到这样的JSON响应:

{
    "xpubaddressONE":{"final_balance":123,"n_tx":0,"total_received":0},
    "xpubaddressTWO":{"final_balance":25221,"n_tx":0,"total_received":0},
    "xpubaddressTHREE":{"final_balance":1123,"n_tx":0,"total_received":0}
}

我想将其反序列化为C#对象。我需要构建这样的类:

public class xpubaddressONE
{
    public int final_balance { get; set; }
    public int n_tx { get; set; }
    public int total_received { get; set; }
}

public class xpubaddressTHREE
{
    public int final_balance { get; set; }
    public int n_tx { get; set; }
    public int total_received { get; set; }
}

public class xpubaddressTWO
{
    public int final_balance { get; set; }
    public int n_tx { get; set; }
    public int total_received { get; set; }
}
public class RootObject
{
    public xpubaddressONE one { get; set; }
    public xpubaddressTWO two { get; set; }
    public xpubaddressTHREE three { get; set; }
}

我的目标是删除其他类(xpubaddressONE,xpubaddressTWO,xpubaddressTHREE)并访问这样的对象:

RootObject.final_balance

2 个答案:

答案 0 :(得分:3)

我会尝试反序列化Dictionary<string, xpubaddress>,其中xpubaddress是:

public class xpubaddress
{
    public int final_balance { get; set; }
    public int n_tx { get; set; }
    public int total_received { get; set; }
}

这将为您提供一个包含3个的字典,您可以使用foreachTryGetValue等进行检查。


或者,坚持您的根类型,但共享内部类型:

public class xpubaddress
{
    public int final_balance { get; set; }
    public int n_tx { get; set; }
    public int total_received { get; set; }
}
public class RootObject
{
    public xpubaddress xpubaddressONE{ get; set; }
    public xpubaddress xpubaddressTWO{ get; set; }
    public xpubaddress xpubaddressTHREE { get; set; }
}

您可能还会发现将属性名称保留为惯用的.NET名称,并使用[JsonProperty][DataMember]重命名它们,即

[JsonProperty("final_balance")]
public int FinalBalance { get; set; }

答案 1 :(得分:1)

您可以引入单个xpubaddress类,例如

public class xpubaddress
{
    public int final_balance { get; set; }
    public int n_tx { get; set; }
    public int total_received { get; set; }
}

然后将其反序列化为IDictionary<string, xpubaddress>,例如,使用xpubaddressONExpubaddressTWO等键添加访问对象

var result = JsonConvert.DeserializeObject<IDictionary<string, xpubaddress>>(json);
var balance = result?["xpubaddressONE"]?.final_balance ?? 0;