Создать сложный JSON с использованием объекта C # - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь создать объект json из c #, который содержит данные. Данные представлены в простом табличном формате. Состоит из столбцов: Имя, InputCode, DisplayID, CodeID, ParentID. Если Parent (Net), тогда ParentID равен нулю. Если Children (Subnet), имеет ParentID, который содержит CodeID of Parent (Net). CodeID является уникальным. Я сталкиваюсь с проблемой с iternation в подсети, используя foreach. Это не разрешено.

public class CodeFrameJson
    {
        public string Name { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public int? InputCodeValue { get; set; }
        public int DisplayId { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public List<CodeFrameJson> Subnet { get; set; }
    }
List<CodeFrameJson> cfj = new List<CodeFrameJson>();
            IEnumerable<CodeDTO> _cfd = new List<CodeDTO>();
            _cfd = codeFrameJson.GetCodeFrame(questionId, projectName);
            _cfd = _cfd.OrderBy(a => a.DisplayOrderNo).ToList();
            foreach (var a in _cfd)
            {
                int CodesID = 0;
                CodeFrameJson obj = new CodeFrameJson();
                if (a.InputCodeValue == null)
                {
                    var root = new CodeFrameJson()
                    {
                        Name = a.CodeName,
                        DisplayId = a.DisplayOrderNo,
                        InputCodeValue = null,
                        Subnet = new List<CodeFrameJson>()
                        {
                            //Start: Not allowing foreach
                            foreach (var x in _cfd)
                            {
                                if (x.ParentId == CodesID)
                                {
                                    new CodeFrameJson()
                                    {
                                        Name = x.CodeName,
                                        InputCodeValue = x.InputCodeValue,
                                        DisplayId = x.DisplayOrderNo
                                    };
                                }
                            }
                    //End: Not allowing foreach
                }
            };
                    obj = root;
                }
                else {
                    var root = new CodeFrameJson()
                    {
                        Name = a.CodeName,
                        DisplayId = a.DisplayOrderNo,
                        InputCodeValue = a.InputCodeValue,
                        Subnet = null
                    };
                    obj = root;
                }
                cfj.Add(obj);
            }
            var json = JsonConvert.SerializeObject(cfj, Formatting.Indented);

Окончательный вывод Что-то вроде этого, что можно легко различить

{
  "Site": {
    "Name": "Site",
    "DisplayID": 1,
    "Subnet": [
      {
        "Name": "Full Site",
        "InputCodeValue": 1,
        "DisplayId": 2
      },
      {
        "Name": "Partial Site",
        "InputCodeValue": 2,
        "DisplayId": 3
      }
    ]
  },
  "Test": {
    "Name": "Test1",
    "InputCodeValue": 3,
    "DisplayId": 4
  }
}

1 Ответ

0 голосов
/ 07 ноября 2019

Это не имеет ничего общего с JSON, но с инициализацией объекта (коллекции). Вы можете только назначать значения там, но LinQ приходит на помощь:

Просто отфильтруйте ваш список и создайте новые объекты в операторе select:

Subnet = _cfd.Where(x => x.ParentId == CodesID).Select(x => new CodeFrameJson
{
    Name = x.CodeName,
    InputCodeValue = x.InputCodeValue,
    DisplayId = x.DisplayOrderNo
}).ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...