将 Json 反序列化为 C#

Deserialize Json into C#

我有一些 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 我不太关心 start-/endtime 部分。

任何帮助将不胜感激...

/索伦

更新:

我自己想出来的:

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();

但我认为下面 Pavel 的解决方案更具可读性....

根据您发布的 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; }
}

您可以使用Json.Linq to get a list of Sample objects from your json. Parse json to 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

获得

如果您的 JSON 不是动态的,创建 类 您的 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; }
}

现在您可以使用 Newtonsoft.Json NuGet 包将 JSON 数组反序列化为 List<Class1>

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