繁体   English   中英

将 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 我并不真正关心开始/结束时间部分。

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

/索伦

更新:

我自己想出了这个:

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.Linq从您的 json 中获取Sample对象的列表。 将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 执行相同的操作,该 API 可从 .NET Core 3.x 获得

根据您发布的 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 不是动态的,那么创建为您的 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM