Десериализовать строку JSON в несколько объектов C # - PullRequest
0 голосов
/ 04 января 2019

У меня есть строка JSON в формате ниже, для которого я хочу десериализовать ее в C # List. Но номер записи "1", "2", "3" ( может быть до 1,2,3 ... n зависит от ответа json каждый раз ) в JSON, что ограничивает меня в десериализации его в объект C # с помощью Newtonsoft.Json

{
"1":{
      "UID":"1",
      "LICENCENO":"licenseno",
      "NAME":"ABC"
    },
"2":{
      "UID":"2",
      "LICENCENO":"licenseno",
      "NAME":"PQR"
    },
"3":{
      "UID":"3",
      "LICENCENO":"licenseno",
      "NAME":"XYZ"      
    }
}

Я использую приведенный ниже код для десериализации

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DriverMaster>>(json);

У меня есть класс DriverMaster, созданный как-

public class DriverMaster
{
    public string UID { get; set; }
    public string LICENCENO { get; set; }
    public string NAME { get; set; }
}

Строка десериализации, дающая необработанное исключение, я знаю, что делаю это неправильно, поскольку объект DriverMaster json не может быть извлечен в c # напрямую, без выполнения что-то для записи номера 1,2,3. ..n в c #. Кто-нибудь может помочь мне разобраться? Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Для таких вещей мне нравится использовать часто пропускаемую функцию JToken.SelectTokens. Эта функция позволяет выбирать токены в строке json и разрешает использование подстановочных знаков.

Вот некоторый код, который будет десериализовать ваш образец, выбрав после 1,2,3 ... N в json:

public static IEnumerable<DriverMaster> Deserialize(string json)
{
    return JToken.Parse(json).SelectTokens("*")
        .Select(jToken => jToken.ToObject<DriverMaster>());
}

* в основном говорит, что нужно выбрать все токены после корня, поэтому он выбирает значения, связанные с 1, 2, 3 ... и т. Д. Вот другой SO ответ, который показывает более сложный использование метода SelectTokens.

0 голосов
/ 04 января 2019

Решение.
Измените код для использования ...

var result = JsonConvert.DeserializeObject<Dictionary<int, DriverMaster>>(json);

Объяснение

Тип не тот же ... Тип List<DriverMaster> будет конвертировать в JSON, как это ...

{
    "1":
    {
        "DriverMaster": {
            "UID":"1",
            "LICENCENO":"licenseno",
            "NAME":"ABC"
        }
    }
}

Это не соответствует тому, что вы показали в своем вопросе ...

Тип, который вы ищете, на самом деле Dictionary<int, DriverMaster>, который представляет собой пару ключ / значение, которая будет выводить строку JSON, например, так:

{
    "1": { ... },
    "2": { ... },
    "3": { ... }
}

Чтобы это исправить, вам нужновместо этого использовать тип Dictionary<int, DriverMaster>.

0 голосов
/ 04 января 2019

Вы были близки:

var result = JsonConvert.DeserializeObject<Dictionary<string, DriverMaster>>(json)
    .Select(x => x.Value)
    .ToList();
0 голосов
/ 04 января 2019

Вам необходимо использовать

public class DriverMaster
{
    public string UID { get; set; }
    public string LICENCENO { get; set; }
    public string NAME { get; set; }
}

public class Root
{
    [JsonExtensionData]
    public IDictionary<string,JToken> Data {get;set;}
}

и

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(json);

Если вы хотите получить результат в виде списка, вы можете проанализировать результат как.

var list = new List<DriverMaster>();
foreach(KeyValuePair<string, JToken> token in result.Data)
{
    list.Add(token.Value.ToObject<DriverMaster>());
}

Это даст вам желаемый результат как

1 licenseno ABC 
2 licenseno PQR 
3 licenseno XYZ 
...