猿问

在 C# 中反序列化 JSON 文件

我不断收到以下错误:


你调用的对象是空的


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

            }

        }

我在这里想念什么?


ibeautiful
浏览 138回答 4
4回答

猛跑小猪

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

qq_花开花谢_0

您必须在属性上方添加 JSON 属性,以便在反序列化对象时识别您的属性。你会在下面找到一个例子public class Parameters{&nbsp; &nbsp; [JsonProperty("bar_diameter")]&nbsp; &nbsp; public float bar_diameter;&nbsp; &nbsp; [JsonProperty("core_height")]&nbsp; &nbsp; public float core_height;&nbsp; &nbsp; [JsonProperty("roughing_offset")]&nbsp; &nbsp; public float roughing_offset;&nbsp; &nbsp; public Parameters(float barD, float coreH, float roughingO)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; bar_diameter = barD;&nbsp; &nbsp; &nbsp; &nbsp; core_height = coreH;&nbsp; &nbsp; &nbsp; &nbsp; roughing_offset = roughingO;&nbsp; &nbsp; }}

杨__羊羊

引用 Prasad Telkikar 的回答,因为它马上就解决了使用 json2csharp 为您的 json 文件获取模型,然后反序列化您的 json。您可以在构建功能中使用 Visual Studio 来创建类,即编辑 -> 特殊粘贴 -> 将 JSON 粘贴为类这是上课> public class PartParameters {>&nbsp; &nbsp; &nbsp;public double bar_diameter { get; set; }>&nbsp; &nbsp; &nbsp;public int core_height { get; set; }>&nbsp; &nbsp; &nbsp;public double roughing_offset { get; set; } }>&nbsp;> public class RootObject {>&nbsp; &nbsp; &nbsp;public PartParameters part_parameters { get; set; } }要反序列化,请使用以下代码PLMpartParameter 部分 = Newtonsoft.Json.JsonConvert.DeserializeObject(json);我的最终代码看起来像这样,它的工作原理!&nbsp; &nbsp; public class PartParameters&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public double bar_diameter { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public int core_height { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public double roughing_offset { get; set; }&nbsp; &nbsp; }&nbsp; &nbsp; public class RootObject&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public PartParameters part_parameters { get; set; }&nbsp; &nbsp; }&nbsp; &nbsp; public static void LoadJson()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; using (System.IO.StreamReader r = new System.IO.StreamReader(@"C:\part_param.json"))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string json = r.ReadToEnd();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RootObject part = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _logger.Info(string.Format("list values : bardiameter: {0}, coreHeight: {1}, roughingOffset: {2}",&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; part.part_parameters.bar_diameter,part.part_parameters.core_height, part.part_parameters.roughing_offset));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (Exception e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _logger.Info(string.Format("Read Json failed {0}", e.Message));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }

GCT1015

您的代码有一些问题:您需要为类提供默认构造函数(这是由于序列化程序如何处理类型 - 它们不会理解您的特定于类的参数化构造函数)。您的字段需要是可设置的属性(只需添加就{get;set;}可以了)。我建议您使用来装饰parameters属性[JsonProperty("part_parameters")]以获得您期望的反序列化行为。
随时随地看视频慕课网APP
我要回答