C # десериализация JSON для использования в цикле foreach - PullRequest
1 голос
/ 02 октября 2019

У меня есть json, отправленный из HTTP-запроса. Я пытаюсь десериализовать его для использования в каждом цикле. К сожалению, его формат пинает мою задницу как список объектов (я верю).

пока у меня есть следующее:

dynamic jsonObj = JsonConvert.DeserializeObject(await req.ReadAsStringAsync());

foreach (var p in jsonObj.hireSchedules)
    {
     ///do something
    }

Мой json такой, как показано ниже:

{
"hireSchedules": [
    {
        "plant": "7246054",
        "num" : "79",
        "hire": "1137277"
     },
    {
        "plant": "7246055",
        "num" : "80",
        "hire": "1137278"
     }
    ]
}

У меня есть следующие классы:

public class HireSchedule
{
    public string plant { get; set; }
    public string num { get; set; }
    public string hire { get; set; }
}

public class RootObject
{
    public List<HireSchedule> hireSchedules { get; set; }
}

Любая помощь будет оценена. Спасибо!

Ответы [ 3 ]

3 голосов
/ 02 октября 2019

Поскольку вы уже определили классы, достаточно легко десериализовать их в них. Тогда у вас есть строго типизированный класс, и среда IDE должна помочь вам получить доступ к свойствам.

var json = File.ReadAllText("json1.json");
var root = JsonConvert.DeserializeObject<RootObject>(json);

foreach (var p in root.hireSchedules)
{
    ///do something
}
0 голосов
/ 02 октября 2019

Одним из способов является использование Newtonsoft.json nuget, который действительно очень мощный, поэтому

var files = JObject.Parse(YourJSON);
var recList = files.SelectTokens("$..hireSchedules").ToList();
foreach (JObject obj in recList.Children())
 {
   foreach (JProperty prop in obj.Children())
      {
        var key = prop.Name.ToString();
        var value = prop.Value.ToString();
         //Do your stuffs here
      }

  }
0 голосов
/ 02 октября 2019

Вам необходимо уточнить тип объекта, чтобы десериализовать его. попробуйте что-то вроде этого:

RootObject jsonObj = JsonConvert.DeserializeObject<RootObject>(await req.ReadAsStringAsync());

, если он не работает или если ваш класс используется только для десериализации, вам лучше использовать:

List<HireSchedule> jsonObj = JsonConvert.DeserializeObject<List<HireSchedule>>(await req.ReadAsStringAsync());
...