【问题标题】:Deserialising JSON files in C#在 C# 中反序列化 JSON 文件
【发布时间】:2019-03-14 14:27:09
【问题描述】:

我不断收到以下错误:

对象引用未设置为对象的实例

这是我在 C:\part_param.json 文件中的 Json 字符串

{    
    "part_parameters" : {
        "bar_diameter" : 300.4,
        "core_height" : 132,
       "roughing_offset" : 0.3    
    } 
}

我使用的代码如下:

    public class PLMpartParameter
    {
        public class Parameters
        {
            public float bar_diameter;
            public float core_height;
            public float roughing_offset;

            public Parameters(float barD, float coreH, float roughingO)
            {
                bar_diameter = barD;
                core_height = coreH;
                roughing_offset = roughingO;
            }
        }
        public Parameters parameters;

        public PLMpartParameter(Parameters param)
        {
            parameters = param;
        }

    }


    public static void LoadJson()
    {
        using (System.IO.StreamReader r = new System.IO.StreamReader(@"C:\part_param.json"))
        {
            string json = r.ReadToEnd();
            _logger.Info(string.Format("Read entire file complete. File Values: {0}", json));

            try
            {
                PLMpartParameter part = Newtonsoft.Json.JsonConvert.DeserializeObject<PLMpartParameter>(json);

            }
            catch (Exception e)
            {
                _logger.Info(string.Format("Read Json failed {0}", e.Message));
            }
        }

我在这里缺少什么?

【问题讨论】:

  • 抛出异常的行可能是?你确定 _logger 设置了吗?
  • 哪一行报错?
  • 您有一个名为 parameters 的字段,但您的 JSON 有一个名为 part_parameters 的属性。 (我个人强烈建议您将 Parameters 类设为顶级,并使用属性而不是公共字段,使用 [JsonProperty] 在 JSON 文件中指定名称,以便您可以使代码符合 .NET 命名约定.)
  • @JonSkeet 在这里,我删除了我的答案。 ;)

标签: c# json json.net json-deserialization


【解决方案1】:

我认为问题在于您的属性被称为“参数”,但在您的 json 中它是“part_parameters”。

【讨论】:

    【解决方案2】:

    您必须在属性上方添加 JSON 属性,以便在反序列化对象时识别您的属性。

    您会在下面找到一个示例

    public class Parameters
    {
        [JsonProperty("bar_diameter")]
        public float bar_diameter;
        [JsonProperty("core_height")]
        public float core_height;
        [JsonProperty("roughing_offset")]
        public float roughing_offset;
    
        public Parameters(float barD, float coreH, float roughingO)
        {
            bar_diameter = barD;
            core_height = coreH;
            roughing_offset = roughingO;
        }
    }
    

    【讨论】:

      【解决方案3】:

      引用 Prasad Telkikar 的回答,因为它马上就解决了

      使用 json2csharp 为你的 json 文件获取模型,然后反序列化你的 json。您可以在构建功能中使用 Visual Studio 来创建类,即 编辑 -> 特殊粘贴 -> 将 JSON 粘贴为类

      这是上课

      > public class PartParameters {
      >     public double bar_diameter { get; set; }
      >     public int core_height { get; set; }
      >     public double roughing_offset { get; set; } }
      > 
      > public class RootObject {
      >     public PartParameters part_parameters { get; set; } }
      

      要反序列化,请使用以下代码

      PLMpartParameter 部分 = Newtonsoft.Json.JsonConvert.DeserializeObject(json);

      我的最终代码看起来像这样,并且可以正常工作!!

          public class PartParameters
          {
              public double bar_diameter { get; set; }
              public int core_height { get; set; }
              public double roughing_offset { get; set; }
          }
      
          public class RootObject
          {
              public PartParameters part_parameters { get; set; }
          }
      
          public static void LoadJson()
          {
              using (System.IO.StreamReader r = new System.IO.StreamReader(@"C:\part_param.json"))
              {
                  string json = r.ReadToEnd();
                  try
                  {
                      RootObject part = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json);
      
                      _logger.Info(string.Format("list values : bardiameter: {0}, coreHeight: {1}, roughingOffset: {2}", 
                          part.part_parameters.bar_diameter,part.part_parameters.core_height, part.part_parameters.roughing_offset));
                  }
                  catch (Exception e)
                  {
                      _logger.Info(string.Format("Read Json failed {0}", e.Message));
                  }
      
              }
      
          }
      

      【讨论】:

      • 你还需要[JsonProperty("part_parameters")]
      • 是的!我是 Json 新手,所以不知道我需要像这样格式化我的属性
      • 这是说“我将称之为 PartParameters 在 JSON 中命名为 part_parameters”。您可以为 bar_diameter 等添加相同的内容,以保留 C# 命名。
      【解决方案4】:

      您的代码存在一些问题:

      1. 您需要为类提供默认构造函数(这是由于序列化程序如何处理类型 - 它们不会理解您的类特定的参数化构造函数)。
      2. 您的字段需要是可设置的属性(只需添加{get;set;} 就可以了)。
      3. 我建议你用[JsonProperty("part_parameters")] 装饰parameters 属性以获得反序列化 您期望的行为。

      【讨论】:

      • 我明白了。我试过了;设置;,但这似乎没有做任何事情。但是正如您在使用 [JsonProperty("part_parameters")] 进行装饰的第三条建议中提到的那样,就成功了
      猜你喜欢
      • 2016-11-14
      • 2015-10-24
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多