如何将 JSON 反序列化回 class?
How to deserialise JSON back to a class?
我有一个 class Limits
。我正在创建此 class 的多个实例,因为我有其他对象,每个对象都需要自己的 Limits
。因此,当我序列化 Limits 的所有实例时,json 中有多个条目。在我的示例中,您会看到我有 Thermo
。想象一下 json 中可能有 Thermo1
、Thermo2
等。我反序列化它,导航到我想要的实例,然后将其转换为 Limits
。但由于某种原因,所有 Min
和 Max
值最终都为 0。
class:
public class Limits
{
Measured_I_ON_struct Measured_I_ON;
Measured_I_OFF_struct Measured_I_OFF;
Measured_V_ON_struct Measured_V_ON;
Measured_V_OFF_struct Measured_V_OFF;
public Limits()
{
Measured_I_ON = new Measured_I_ON_struct();
Measured_I_OFF = new Measured_I_OFF_struct();
Measured_V_ON = new Measured_V_ON_struct();
Measured_V_OFF = new Measured_V_OFF_struct();
}
public struct Measured_I_ON_struct
{
public double Min;
public double Max;
}
public struct Measured_I_OFF_struct
{
public double Min;
public double Max;
}
public struct Measured_V_ON_struct
{
public double Min;
public double Max;
}
public struct Measured_V_OFF_struct
{
public double Min;
public double Max;
}
}
我有一个 json :
{"Thermo":{
"Measured_V_ON":
{
"Min" : 4.5,
"Max" : 5.5
},
"Measured_V_OFF": {
"Min" : 4.5,
"Max" : 5.5
},
"Measured_I_ON": {
"Min" : 4.5,
"Max" : 5.5
},
"Measured_I_OFF": {
"Min" : 0.15,
"Max" : 0.22
},
}
}
我正在尝试将 json 反序列化回 class Limits 的实例,但每个结构中的值都显示为 0。
string json = File.ReadAllText("new 2.json");
JToken jsonobject = JsonConvert.DeserializeObject<JToken>(json);
jsonobject = jsonobject["Thermo"];
Limits limits = new Limits();
limits = jsonobject.ToObject<Limits>();
范围内的所有值都为 0。我在这里缺少什么?
您的字段是私有的,这就是它们未被更改的原因。
虽然我会显着更改您的代码:
- 对所有限制使用单一类型,因为它们完全相同。
- 使用 class 而不是结构,以避免创建可变结构。 (您可以改用自定义转换器,但我认为使用 class 更简单。)
- 对
Limits
中的属性使用 public 属性而不是私有字段
- 重命名属性以遵循 .NET 命名约定,使用
[JsonProperty]
在 JSON. 中指定您想要的名称
所以像这样:
public class Limit
{
public double Min { get; set; }
public double Max { get; set; }
}
public class Limits
{
// TODO: Rename these further to expand on "I" and "V" if possible
[JsonProperty("Measured_I_ON")]
public Limit MeasuredIOn { get; set; } = new Limit();
[JsonProperty("Measured_I_OFF")]
public Limit MeasuredIOff { get; set; } = new Limit();
[JsonProperty("Measured_V_ON")]
public Limit MeasuredVOn { get; set; } = new Limit();
[JsonProperty("Measured_V_OFF")]
public Limit MeasuredVOff { get; set; } = new Limit();
}
下载 Newtonsoft.Json Nuget 包。用 C# 解析 Json 非常方便。
你可以这样写。
string json = File.ReadAllText("new2.json");
var jsonobject = JObject.Parse(json);
var jsonBody = jsonobject["Thermo"].ToString();
LimitsRoot limitsRoot = new LimitsRoot();
limitsRoot = JsonConvert.DeserializeObject<LimitsRoot>(jsonBody);
LimitsRoot 相关 类 如下所示
public class MeasuredVON
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredVOFF
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredION
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredIOFF
{
public double Min { get; set; }
public double Max { get; set; }
}
public class LimitsRoot
{
public MeasuredVON Measured_V_ON { get; set; }
public MeasuredVOFF Measured_V_OFF { get; set; }
public MeasuredION Measured_I_ON { get; set; }
public MeasuredIOFF Measured_I_OFF { get; set; }
}
然后你可以通过运行检查你会得到正确的值如下
limitsRoot.Measured_V_ON.Min
4.5
我有一个 class Limits
。我正在创建此 class 的多个实例,因为我有其他对象,每个对象都需要自己的 Limits
。因此,当我序列化 Limits 的所有实例时,json 中有多个条目。在我的示例中,您会看到我有 Thermo
。想象一下 json 中可能有 Thermo1
、Thermo2
等。我反序列化它,导航到我想要的实例,然后将其转换为 Limits
。但由于某种原因,所有 Min
和 Max
值最终都为 0。
class:
public class Limits
{
Measured_I_ON_struct Measured_I_ON;
Measured_I_OFF_struct Measured_I_OFF;
Measured_V_ON_struct Measured_V_ON;
Measured_V_OFF_struct Measured_V_OFF;
public Limits()
{
Measured_I_ON = new Measured_I_ON_struct();
Measured_I_OFF = new Measured_I_OFF_struct();
Measured_V_ON = new Measured_V_ON_struct();
Measured_V_OFF = new Measured_V_OFF_struct();
}
public struct Measured_I_ON_struct
{
public double Min;
public double Max;
}
public struct Measured_I_OFF_struct
{
public double Min;
public double Max;
}
public struct Measured_V_ON_struct
{
public double Min;
public double Max;
}
public struct Measured_V_OFF_struct
{
public double Min;
public double Max;
}
}
我有一个 json :
{"Thermo":{
"Measured_V_ON":
{
"Min" : 4.5,
"Max" : 5.5
},
"Measured_V_OFF": {
"Min" : 4.5,
"Max" : 5.5
},
"Measured_I_ON": {
"Min" : 4.5,
"Max" : 5.5
},
"Measured_I_OFF": {
"Min" : 0.15,
"Max" : 0.22
},
}
}
我正在尝试将 json 反序列化回 class Limits 的实例,但每个结构中的值都显示为 0。
string json = File.ReadAllText("new 2.json");
JToken jsonobject = JsonConvert.DeserializeObject<JToken>(json);
jsonobject = jsonobject["Thermo"];
Limits limits = new Limits();
limits = jsonobject.ToObject<Limits>();
范围内的所有值都为 0。我在这里缺少什么?
您的字段是私有的,这就是它们未被更改的原因。
虽然我会显着更改您的代码:
- 对所有限制使用单一类型,因为它们完全相同。
- 使用 class 而不是结构,以避免创建可变结构。 (您可以改用自定义转换器,但我认为使用 class 更简单。)
- 对
Limits
中的属性使用 public 属性而不是私有字段 - 重命名属性以遵循 .NET 命名约定,使用
[JsonProperty]
在 JSON. 中指定您想要的名称
所以像这样:
public class Limit
{
public double Min { get; set; }
public double Max { get; set; }
}
public class Limits
{
// TODO: Rename these further to expand on "I" and "V" if possible
[JsonProperty("Measured_I_ON")]
public Limit MeasuredIOn { get; set; } = new Limit();
[JsonProperty("Measured_I_OFF")]
public Limit MeasuredIOff { get; set; } = new Limit();
[JsonProperty("Measured_V_ON")]
public Limit MeasuredVOn { get; set; } = new Limit();
[JsonProperty("Measured_V_OFF")]
public Limit MeasuredVOff { get; set; } = new Limit();
}
下载 Newtonsoft.Json Nuget 包。用 C# 解析 Json 非常方便。 你可以这样写。
string json = File.ReadAllText("new2.json");
var jsonobject = JObject.Parse(json);
var jsonBody = jsonobject["Thermo"].ToString();
LimitsRoot limitsRoot = new LimitsRoot();
limitsRoot = JsonConvert.DeserializeObject<LimitsRoot>(jsonBody);
LimitsRoot 相关 类 如下所示
public class MeasuredVON
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredVOFF
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredION
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredIOFF
{
public double Min { get; set; }
public double Max { get; set; }
}
public class LimitsRoot
{
public MeasuredVON Measured_V_ON { get; set; }
public MeasuredVOFF Measured_V_OFF { get; set; }
public MeasuredION Measured_I_ON { get; set; }
public MeasuredIOFF Measured_I_OFF { get; set; }
}
然后你可以通过运行检查你会得到正确的值如下
limitsRoot.Measured_V_ON.Min
4.5