c # вложенный json в объект (текущий с json.net) - PullRequest
0 голосов
/ 13 октября 2019

Я новичок в c # и json.net. У меня есть файл конфигурации JSON и пытаюсь разобрать его для объектов. Но как я могу правильно сопоставить отношения в объектах? В настоящее время свойство в цикле проекта является нулевым. И могут ли объекты отображаться «автоматически» без сопоставления каждого имени / значения свойства? Я также могу изменить json!

configuration.json:

{
  "debug": true,
  "log": "database",
  "projects": [
    {
      "name": "Name 1",
      "showInfo": false,
      "ranges": [
        [
          5,
          6
        ],
        [
          9,
          10
        ],
        [
          15,
          20
        ]
      ],
      "additional": [
        {
          "name": "subName 1",
          "parameter": "ID"
        },
        {
          "name": "subName 2",
          "parameter": "ID2"
        }
      ]
    },
    {
      "name": "Name 2",
      "showInfo": false,
      "ranges": [
        [
          99,
          100
        ]
      ]
    },
    {
      "name": "Name 3",
      "showInfo": false,
      "ranges": [
        [
          44,
          45
        ]
      ]
    },
    {
      "name": "Name 4",
      "showInfo": false,
      "ranges": [
        [
          12,
          14
        ]
      ],
      "additional": [
        {
          "name": "subName xy",
          "parameter": "ID"
        }
      ]
    }
  ]
}

моя попытка разобрать:

Configuration configuration = new Configuration();
JObject jObject = JObject.Parse(File.ReadAllText(filePath));

if (jObject.ContainsKey("debug"))
{
    configuration.Debug = (bool) jObject["debug"];
}
if (jObject.ContainsKey("log"))
{
    configuration.Log = (string) jObject["log"];
}

//loop projects
JToken projects = jObject["projects"];

foreach (JToken child in projects.Children())
{
    var property = child as JProperty;
    if (property != null)
    {
        var test = property.Name;
        var test2 = property.Value;
    }
}

объекты:

public class Configuration
{
    public bool Debug { get; set; } = false;
    public string Log { get; set; }
    // this is propably wrong
    public Dictionary<string, Dictionary<string, Project>> Projects { get; set; }
}

public class Project
{
    public string name { get; set; }
    public bool showInfo{ get; set; }
    // wrong?
    public int[,] ranges { get; set; }
    // wrong?
    public Additional[] Additional{ get; set; }
}
public class Additional
{
   public string Name{ get; set; }
   public string Parameter { get; set; }
}

1 Ответ

2 голосов
/ 13 октября 2019

Вам не нужно JObject, все файлы json могут быть дестерилизованы для объектов, это намного эффективнее, потому что вы не создаете ненужные объекты. Ваш конфиг класс просто неправильный

public class Configuration
    {
        public bool Debug { get; set; }
        public string Log { get; set; }
        public Project[] Projects { get; set; }
    }

    public class Project
    {
        public string Name { get; set; }
        public bool ShowInfo { get; set; }
        public int[][] Ranges { get; set; }
        public Additional[] Additional { get; set; }
    }

    public class Additional
    {
        public string Name { get; set; }
        public string Parameter { get; set; }
    }`

Должно выглядеть так. А потом пользуйся. JsonConvert.DeserializeObject<Configuration>(json); Чтобы получить объект. Если у вас есть Visual Studio, у нее есть эта классная функция, которая называется paste special, где вы можете просто пропустить свой json, и он создаст подходящий класс для десериализации. Он находится под Edit-> Paste special-> Paste json as class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...