Десериализация файлов JSON в C # - PullRequest
0 голосов
/ 14 марта 2019

Я получаю следующую ошибку:

Ссылка на объект не установлена ​​на экземпляр объекта

Это моя строка Json в файле в C: \ part_param.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 ]

2 голосов
/ 14 марта 2019

Я думаю, проблема в том, что ваше свойство называется «параметры», но в вашем json это «part_parameters».

1 голос
/ 14 марта 2019

Вы должны добавить атрибут 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;
    }
}
1 голос
/ 14 марта 2019

Цитирую ответ Прасада Телкикара, который сразу его исправил

Используйте 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));
            }

        }

    }
0 голосов
/ 14 марта 2019

У вас есть несколько проблем с вашим кодом:

  1. Вам необходимо иметь конструкторы по умолчанию для классов (это связано с тем, как сериализаторы работают с типами - они не будут понимать ваш специфический для класса параматеризованный конструктор).
  2. Ваши поля должны иметь настраиваемые свойства (просто добавьте {get;set;}, и все будет хорошо).
  3. Я бы посоветовал вам украсить свойство parameters с [JsonProperty("part_parameters")], чтобы получить десериализацию. ожидаемое поведение.
...