Десериализовать Json в C# - PullRequest
       3

Десериализовать Json в C#

0 голосов
/ 29 февраля 2020

У меня есть Json, который выглядит следующим образом:

[
  {
    "starttime": "2020-02-27T14:30:00Z",
    "endtime": "2020-02-27T14:40:00Z"
  },
  {
    "Temp": {
      "value": 3
    },
    "Pressure": {
      "value": 29
    },
    "Humidity": {
      "value": 85
    }
  }
]

Я хотел бы десериализовать его на объект в форме:

public class Sample {
   public string Name {get; set;}
   public int Value {get;set;}
}

, а затем получить 3 случаи, когда для имени задано значение «Темп.», «Давление», «Влажность» и «Значение», равное 3, 29, 85. Меня не особо волнует время начала / окончания.

Любая помощь будет принята с благодарностью. .

/ Søren

Обновление:

Сам придумал это:

var tmp = JsonConvert.DeserializeObject<JArray>(content);

var samples = tmp.
    SelectMany(x => ((JToken) x).Children())
    .Where(x => !((JProperty) x).Name.Contains("time"))
    .Select(x =>
    {
        var tmp2 = x.First.ToObject<Sample>();
        tmp2.name = ((JProperty) x).Name;
        return tmp2;
    })
    .ToList();

но я думаю, что решение Павла ниже, более читабельно .. ..

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

Вы можете использовать Json.Linq, чтобы получить список Sample объектов из вашего json. Выполните синтаксический анализ json до JArray экземпляра, затем перечислите все свойства последнего объекта, чтобы получить имена и значения

var array = JArray.Parse(json);

var samples = ReadSamples(array.Last());
foreach (var sample in samples)
{
    Console.WriteLine($"{sample.Name} {sample.Value}");
}

IEnumerable<Sample> ReadSamples(JToken data)
{
    foreach (JProperty item in data)
    {
        yield return new Sample()
        {
            Name = item.Name,
            Value = item.Value["value"]?.Value<int>() ?? 0
        };
    }
}

Выходные данные будут следующие

Temp 3
Pressure 29
Humidity 85

Также возможно сделать то же самое, используя System.Text.Json API, который доступен из. NET Core 3.x

0 голосов
/ 29 февраля 2020

Если ваш JSON не является динамическим c, хорошая идея создать классы, моделирующие ваш JSON.

Простой способ - Скопировать JSON в буфер обмена -> Откройте Visual Studio -> Правка -> Специальная вставка -> Вставить JSON как классы .

Это должно дать вам следующие классы:

public class Class1
{
    public DateTime starttime { get; set; }
    public DateTime endtime { get; set; }
    public Temp Temp { get; set; }
    public Pressure Pressure { get; set; }
    public Humidity Humidity { get; set; }
}

public class Temp
{
    public int value { get; set; }
}

public class Pressure
{
    public int value { get; set; }
}

public class Humidity
{
    public int value { get; set; }
}

И теперь вы можете десериализовать массив JSON в List<Class1>, используя Newtonsoft. Json Пакет NuGet:

using Newtonsoft.Json;
using System.Collections.Generic;

...

string json = @"[
  {
    ""starttime"": ""2020 - 02 - 27T14: 30:00Z"",
    ""endtime"": ""2020-02-27T14:40:00Z""
  },
  {
    ""Temp"": {
      ""value"": 3
    },
    ""Pressure"": {
      ""value"": 29
    },
    ""Humidity"": {
      ""value"": 85
    }
  }
]";

var myObject = JsonConvert.DeserializeObject<List<Class1>>(json);
0 голосов
/ 29 февраля 2020

За ваши опубликованные JSON, вы получите модель, как показано ниже. Используйте http://json2csharp.com/#

public class Temp
{
    public int value { get; set; }
}

public class Pressure
{
    public int value { get; set; }
}

public class Humidity
{
    public int value { get; set; }
}

public class RootObject
{
    public DateTime starttime { get; set; }
    public DateTime endtime { get; set; }
    public Temp Temp { get; set; }
    public Pressure Pressure { get; set; }
    public Humidity Humidity { get; set; }
}
...