Чтение json из файла и десериализация всегда возвращает ноль

Я читаю Json из файла, и когда я пытаюсь десериализовать его с помощью Newtonsoft Json, он возвращает ноль. Я создаю класс JSON из http://json2csharp.com/. Я не уверен в причине, по которой он говорит, что null это из-за специальных символов, таких как \n,\r и т. Д., Которые он вводит при использовании StreamReader. Пожалуйста помоги.

Json (я проверил с JsonLint и его действительным JSON)

{
    "Machine Learning Functions": [{
        "Function": "JaccardDistance",
        "ArgCount": 2,
        "Arg1": "Point1",
        "Arg1Type": "Point",
        "Arg2": "Point2",
        "Arg2Type": "Point",
        "Return": "distance",
        "ReturnType": "Double"
    }],
    "Math Functions": [{
        "Function": "Cosine",
        "ArgCount": 2,
        "Arg1": "document1",
        "Arg1Type": "String",
        "Arg2": "document2",
        "Arg2Type": "String",
        "Return": "angle",
        "ReturnType": "Integer"
    }, {
        "Function": "SQRT",
        "ArgCount": 1,
        "Arg1": "SomeNumber",
        "Arg1Type": "Integer",
        "Return": "Number",
        "ReturnType": "Integer"
    }]

}

Код C# (взят из json2csharp)

 public class MachineLearningFunction
    {
        public string Function { get; set; }
        public int ArgCount { get; set; }
        public string Arg1 { get; set; }
        public string Arg1Type { get; set; }
        public string Arg2 { get; set; }
        public string Arg2Type { get; set; }
        public string Return { get; set; }
        public string ReturnType { get; set; }
    }

    public class MathFunction
    {
        public string Function { get; set; }
        public int ArgCount { get; set; }
        public string Arg1 { get; set; }
        public string Arg1Type { get; set; }
        public string Arg2 { get; set; }
        public string Arg2Type { get; set; }
        public string Return { get; set; }
        public string ReturnType { get; set; }
    }

    public class RootObject
    {
        public List<MachineLearningFunction> MachineLearningFunctions { get; set; }
        public List<MathFunction> MathFunctions { get; set; }
    }

Этот json хранится в файле, и я читаю следующее, когда я сохраняю точку останова, он читает строку, вводя некоторые специальные символы, такие как \n,\r и т. Д. Но когда я пытаюсь десериализовать точку останова, отображается ноль, и я получаю исключение нулевой ссылки при итерации по списку.

 string json = string.Empty;
            using (StreamReader reader = new StreamReader(@"C:\Users\Nikh\OneDrive\Documents\Application/json.txt"))
            {
                json = reader.ReadToEnd();
            }
 ParseAndConstructJson(json);

public void ParseAndConstructJson(string json) //Using Newtonsoft json
        {
            RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
            foreach (var item in obj.MachineLearningFunctions)
            {
                MessageBox.Show(item.Function);
            }//DataGrid dg = new DataGrid();
}

2 ответа

Решение

Вы должны определить с JsonProperty ваши свойства в RootObject сопоставить их с файлом JSON.

public class RootObject
{
    [JsonProperty(PropertyName ="Machine Learning Functions")]
    public List<MachineLearningFunction> MachineLearningFunctions { get; set; }

    [JsonProperty(PropertyName ="Math Functions")]
    public List<MathFunction> MathFunctions { get; set; }
}

Удалите пробелы из: "Функции машинного обучения" и "Математические функции" в файле JSON, и он без десериализации вашего объекта.

Другие вопросы по тегам