为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中反序列化 JSON 文件

在 C# 中反序列化 JSON 文件

C#
ibeautiful 2022-10-23 16:27:43
我不断收到以下错误:你调用的对象是空的这是我在 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 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-10-23
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

您必须在属性上方添加 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;

    }

}


查看完整回答
反对 回复 2022-10-23
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

引用 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));

            }


        }


    }


查看完整回答
反对 回复 2022-10-23
?
GCT1015

TA贡献1827条经验 获得超4个赞

您的代码有一些问题:

  1. 您需要为类提供默认构造函数(这是由于序列化程序如何处理类型 - 它们不会理解您的特定于类的参数化构造函数)。

  2. 您的字段需要是可设置的属性(只需添加就{get;set;}可以了)。

  3. 我建议您使用来装饰parameters属性[JsonProperty("part_parameters")]以获得您期望的反序列化行为。


查看完整回答
反对 回复 2022-10-23
  • 4 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号