如何将 JSON 反序列化回 class?

How to deserialise JSON back to a class?

我有一个 class Limits。我正在创建此 class 的多个实例,因为我有其他对象,每个对象都需要自己的 Limits。因此,当我序列化 Limits 的所有实例时,json 中有多个条目。在我的示例中,您会看到我有 Thermo。想象一下 json 中可能有 Thermo1Thermo2 等。我反序列化它,导航到我想要的实例,然后将其转换为 Limits。但由于某种原因,所有 MinMax 值最终都为 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