簡體   English   中英

使用Newtonsoft.Json將兩個數組轉換為一個JSON對象

[英]Convert two arrays into one JSON object using Newtonsoft.Json

我有數組name[]lastname[] 如何將它們組合並轉換為JSON字符串? 我希望它采用以下格式。 我需要JSON中的“Employees”標題。

{ "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]}]}

所有的名字,姓氏都放在一起。 我如何獲得正確的格式?

您可以將它們與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

如果您實際上有一個包含員工枚舉的對象的枚舉,您可以使用Enumerable.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 } ] 

工作小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM