Есть ли способ обойти root объект во время десериализации? - PullRequest
0 голосов
/ 03 февраля 2020

Я получаю 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 ]

3 голосов
/ 03 февраля 2020

Я бы попробовал десериализовать 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 ключами , который вы можете проверить с помощью foreach, TryGetValue, et c.


В качестве альтернативы, придерживайтесь своего типа root, но поделитесь внутренним типом:

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; }
}

Вы также можете найти его проще оставить имена свойств как idiomati c. NET names и использовать [JsonProperty] или [DataMember] для их переименования, т.е.

[JsonProperty("final_balance")]
public int FinalBalance { get; set; }
1 голос
/ 03 февраля 2020

Вы можете ввести один класс 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>, например, добавить объекты доступа, используя xpubaddressONE, xpubaddressTWO, et c., ключи

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