Как создать строку JSON из списка C # объекта с конкретными свойствами? - PullRequest
0 голосов
/ 01 сентября 2018

Предположим, у меня есть значения ниже в раскрывающемся списке (переменная dropDownList), а выбранные пользователем значения находятся в списке selectedDropDownValues.

И DB api возвращает список клиентов (переменная customerDBList).

Теперь требуется построить JSON из выбранных значений, как указано ниже -

var dropDownList = new[] { "Customer.Id", "Customer.FirstName", "Customer.LastName", "Customer.Address.AddressLine1", "Customer.Address.AddressLine2" };

var selectedDropDownValues = new[] { "Customer.Id", "Customer.FirstName", "Customer.Address.AddressLine1" };

var customerDBList = new List<Customer>(){
                new Customer {
                    Id=1,
                    FirstName="John",
                    LastName="Desouza",
                    Address=new Address{            
                                AddressLine1="1 Street",
                                AddressLine2="Linking Road"
                    }},        
                new Customer {
                    Id=2,
                    FirstName="Sam",
                    LastName="Lewis",
                    Address=new Address{            
                                AddressLine1="Fedral Highway",
                                AddressLine2="Louisville"
                    }                
                }};

Ожидаемый вывод JSON как -

[
  {
    "Customer": {
      "Id": 1,
      "FirstName": "John",
      "Address": {
        "AddressLine1": "1 Street"
      }
    }
  },
  {
    "Customer": {
      "Id": 2,
      "FirstName": "Sam",
      "Address": {
        "AddressLine1": "Fedral Highway"
      }
    }
  }
]

1 Ответ

0 голосов
/ 01 сентября 2018

Как оказалось, ваши selectedDropDownValues строки "Customer.Address.AddressLine1" имеют синтаксис JSONPath , поэтому вы можете преобразовать свои Customer объекты в промежуточные JObject и затем удалить ненужные значения, используя JsonExtensions.RemoveAllExcept(this JObject obj, IEnumerable<string> paths) от этого ответа до Как выполнить частичную сериализацию объектов, предоставляя "пути" с помощью Newtonsoft JSON.NET .

Обратите внимание, что в вашем желаемом JSON есть дополнительный уровень вложенности { "Customer": { ... } }, отсутствующий в вашей модели данных, поэтому его необходимо вставить вручную перед фильтрацией:

var rootName = "Customer";

var query = customerDBList
    // Convert to JObject
    .Select(c => JObject.FromObject(c))
    // Add additional level of object nesting { "Customer": { ... } } 
    .Select(o => new JObject( new JProperty(rootName, o)))
    // Remove all but selected properties.
    .Select(o => o.RemoveAllExcept(selectedDropDownValues));

var json = JsonConvert.SerializeObject(query, Formatting.Indented);

Рабочий пример .Net fiddle здесь , который показывает сгенерированный JSON, как требуется,

[
  {
    "Customer": {
      "Id": 1,
      "FirstName": "John",
      "Address": {
        "AddressLine1": "1 Street"
      }
    }
  },
  {
    "Customer": {
      "Id": 2,
      "FirstName": "Sam",
      "Address": {
        "AddressLine1": "Fedral Highway"
      }
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...