在C#中反序列化JSON文件

时间:2019-03-14 14:27:10

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

我一直收到以下错误:

  

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

这是我在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));
            }
        }

我在这里想念什么?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

立刻引用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 part =   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));
            }

        }

    }

答案 2 :(得分:1)

必须在属性上方添加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 :(得分:0)

您的代码有一些问题:

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