将 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);
我有一些 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);