Преобразуйте два массива в один объект JSON с помощью Newtonsoft.формат JSON
у меня есть массивы name[]
и lastname[]
. Как объединить и преобразовать их в строку JSON? Я хочу, чтобы он был в следующем формате. Мне нужно название "сотрудники" в JSON.
{ "Employees" : [
{"name": "John", "lastname": "Coleman"},
{"name": "Chip", "lastname": "Dale"},
{"name": "Ann", "lastname": "Smith"},
{"name": "Terry", "lastname": "Johnson"},
{"name": "Mary", "lastname": "Loggins"},
{"name": "Timothy", "lastname": "Lopez"},
{"name": "Jessica", "lastname": "Brown"}
]}
мне нужен эффективный способ сделать это, поскольку в массивах есть много элементов. На самом деле у меня есть более двух массивов, которые мне нужно объединить в объект JSON. Для простоты я продемонстрировал, что я хочу с двумя. Все они имеют одинаковое количество предметов и заказываются. Я не хочу для итерации массивов и построения строки JSON самостоятельно.
обновление:
Я забыл упомянуть, что мой массивы IEnumerable<[]>
строковые и целочисленные массивы. Вот что я попробовал, массивы создаются в другом классе.
public string[] Name {
get{ return (Employees ?? Enumerable.Empty<Employee> ()).Select (p => p.name).ToArray(); }
}
public string[] Lastname {
get{ return (Employees ?? Enumerable.Empty<Employee> ()).Select (p => p.lastname).ToArray(); }
}
public int[] Age {
get{ return (Employees ?? Enumerable.Empty<Employee> ()).Select (p => p.age).ToArray(); }
}
Я тогда доступ к ним
var name = X.Select(s => s.Name).ToArray();
var lastname = X.Select(s => s.Lastname).ToArray();
var age = X.Select(s => s.Age).ToArray();
var employees = new { Employees = Enumerable.Range(0, name.Length).Select(i => new { name = name[i], lastname = lastname[i], age = age[i] }) };
var json = JsonConvert.SerializeObject(employees, Formatting.Indented);
Debug.WriteLine(json);
по какой-то причине это возвращает что-то похожее на
{"Employees":[{"name":["John","Chip","Ann","Terry"],"lastname":["Coleman","Dale","Smith","Johnson"],"age":[42, 26, 33, 24]}]}
где все имена, фамилии все вместе взятые. Как получить правильный формат?
1 ответов
вы можете объединить их с Zip()
на анонимного типа, затем сериализовать, что:
string[] name = new string[] { "John", "Chip" };
string[] lastname = new string[] { "Coleman", "Dale" };
var employees = new { Employees = name.Zip(lastname, (n1, n2) => new { name = n1, lastname = n2 }) };
var json = JsonConvert.SerializeObject(employees, Formatting.Indented);
Debug.WriteLine(json);
выходы:
{ "Employees": [ { "name": "John", "lastname": "Coleman" }, { "name": "Chip", "lastname": "Dale" } ] }
для нескольких массивов может быть проще использовать Enumerable.Range()
для параллельного перебора массивов:
string[] name = new string[] { "John", "Chip" };
string[] lastname = new string[] { "Coleman", "Dale" };
string[] title = new string[] { "Mr", "Dr" };
string[] profession = new string[] { "Coder", "Doctor" };
var employees2 = new { Employees = Enumerable.Range(0, name.Length).Select(i => new { title = title[i], name = name[i], lastname = lastname[i], profession = profession[i] }) };
var json2 = JsonConvert.SerializeObject(employees2, Formatting.Indented);
Debug.WriteLine(json2);
обновление
если ваши строки находятся в IEnumerable<String[]>
, вы можете преобразовать это внешнее перечисляемое в массив затем индексируйте в него. Например, учитывая следующий тестовый случай:
string[] name = new string[] { "John", "Chip" };
string[] lastname = new string[] { "Coleman", "Dale" };
string[] title = new string[] { "Mr", "Dr" };
string[] profession = new string[] { "Coder", "Doctor" };
IEnumerable<string[]> strings = new[] { title, name, lastname, profession };
вы могли бы сделать:
var stringArray = strings.ToArray();
var employees2 = new { Employees = Enumerable.Range(0, name.Length).Select(i => new { title = stringArray[0][i], name = stringArray[1][i], lastname = stringArray[2][i], profession = stringArray[3][i] }) };
var json2 = JsonConvert.SerializeObject(employees2, Formatting.Indented);
Debug.WriteLine(json2);
что приводит к:
{ "Employees": [ { "title": "Mr", "name": "John", "lastname": "Coleman", "profession": "Coder" }, { "title": "Dr", "name": "Chip", "lastname": "Dale", "profession": "Doctor" } ] }
обновление 2
если у вас действительно есть перечисление объектов, содержащих перечисление сотрудников, вы можете сгладить их с перечисли.Метода SelectMany. Например, учитывая следующие классы:
public class Employee
{
public string name { get; set; }
public string lastname { get; set; }
public int age { get; set; }
public string someMoreDataThatShouldNotBeSerialized { get; set; }
}
public class EmployeeContainer
{
public IEnumerable<Employee> Employees { get; set; }
}
вы можете расплющить их следующим образом:
var X = GetAllEmployees();
var employees = X.SelectMany(s => s.Employees ?? Enumerable.Empty<Employee>()).Select(e => new { name = e.name, lastname = e.lastname, age = e.age });
var json = JsonConvert.SerializeObject(employees, Formatting.Indented);
Debug.WriteLine(json);
испытательные установки
public static IEnumerable<EmployeeContainer> GetAllEmployees()
{
return new[] {
new EmployeeContainer {
Employees =
new[] {
new Employee { name = "John", lastname = "Coleman", age = 42, someMoreDataThatShouldNotBeSerialized = "someMoreData1" },
new Employee { name = "Chip", lastname = "Dale", age = 26, someMoreDataThatShouldNotBeSerialized = "someMoreData2" },
}
},
new EmployeeContainer {
Employees =
new[] {
new Employee { name = "Ann", lastname = "Smith", age = 33, someMoreDataThatShouldNotBeSerialized = "someMoreData3" },
new Employee { name = "Terry", lastname = "Johnson", age = 24, someMoreDataThatShouldNotBeSerialized = "someMoreData4" },
}
},
new EmployeeContainer()
};
}
выдает:
[ { "name": "John", "lastname": "Coleman", "age": 42 }, { "name": "Chip", "lastname": "Dale", "age": 26 }, { "name": "Ann", "lastname": "Smith", "age": 33 }, { "name": "Terry", "lastname": "Johnson", "age": 24 } ]
работающего скрипка.