C# 使用Newtonsoft.JSON将两个数组转换为一个JSON对象
我有数组C# 使用Newtonsoft.JSON将两个数组转换为一个JSON对象,c#,arrays,json,json.net,C#,Arrays,Json,Json.net,我有数组name[]和lastname[]。如何将它们组合并转换为JSON字符串?我希望它是以下格式。我需要JSON中的“雇员”标题 { "Employees" : [ {"name": "John", "lastname": "Coleman"}, {"name": "Chip", "lastname": "Dale"}, {"name": "Ann", "lastname": "Smith"}, {"name": "Terry", "lastname": "J
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(); }
}
出于某种原因,这会返回类似于
{"Employees":[{"name":["John","Chip","Ann","Terry"],"lastname":["Coleman","Dale","Smith","Johnson"],"age":[42, 26, 33, 24]}]}
所有的名字,姓氏都放在一起。如何获得正确的格式 您可以将它们与组合成,然后序列化:
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);
哪些产出:
对于多个数组,并行遍历数组可能更容易:
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[] 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 };
其结果是:
更新2
如果实际有一个包含员工枚举的对象枚举,则可以使用。例如,给定以下类:
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; }
}
正在工作。请向我们展示您的
名称
和姓氏
数组。更新示例中的X
是什么?它是一个包含员工列表的类上的可枚举对象吗?它是一个不同的反序列化json对象吗?它是一个对象还是一个包含属性的对象的可枚举对象<代码>公共字符串[]名称代码>和<代码>公共字符串[]Lastname和<代码>公共int[]年龄?如果是这样的话,您有字符串数组,而不是字符串数组。您需要使用,比如说,SelectMany
,将它们展平。是的,它是一个包含属性的可枚举项。如果我使用公共字符串[]Name{get{return(Employees??Enumerable.Empty()).SelectMany(p=>p.Name);}},我会得到错误CS0411:无法从用法推断方法'System.Linq.Enumerable.SelectMany(this System.Collections.Generic.IEnumerable,System.Func')的类型参数。尝试显式指定类型参数这是否适用于2个以上的数组?Zip()只接受2个数组作为参数。对于7+阵列,您是否会在彼此之后运行多个拉链?有更优雅的解决方案吗?@DanielHoffmann Mitscherling-好吧,因为它们是数组,你可以做Enumerable.Range(0,array0.Length)。选择(i=>new{a=array0[i],b=array1[i],c=array2[i],…)
否则就是多个ZIP,或者用多个输入创建你自己的扩展方法。对,第一个很明显,但是作者要求不要迭代数组,但是Zip()无论如何都会这样做(但您不必为此编写代码)。我不知道他/她到底想尝试什么。很高兴知道你可以串多个拉链!(尽管扩展方法更好)@DanielHoffmann Mitscherling-我认为这意味着OP不想编写手动foreach
循环。在某种级别的代码(可能是Json.NET本身)中,需要访问每个数组元素。@dbc同意!对你答案的编辑使它成为一个很好的答案。
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"
}
]
}
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
}
]