如何将对象转换为不带属性名称的json数组

时间:2018-08-01 15:38:22

标签: c# json

对于本课程

class Customer {
  public string FirstName {get; set;}
  public string LastName {get; set;}
}

我有收藏

List<Customer> customers

返回浏览器客户端时

return new JsonResult(new
{
                data = customers
});

客户得到

{"data":[{"firstName":"Johny","lastName":"Johnson"}]}

有什么办法获取

{"data":[{"Johny","Johnson"}]}

无需像foreach那样

var output = new List<string[]>();
foreach (var r in customers)
{
     output.Add(new string[] {
          r.FirstName,
          r.LastName
     });
}

2 个答案:

答案 0 :(得分:2)

您可以在Customer对象中添加另一个属性,

public string[] FullName {get { return new string[]{FirstName, LastName}; } } 

[JsonIgnore]装饰您的名字和姓氏属性,以便它们不会被序列化。

最终产品看起来像这样

public class Customer{

    [JsonIgnore]
    public string FirstName{get;set;}
    [JsonIgnore]
    public string LastName{get;set;}
    [JsonProperty("data")]
    public string[] FullName {get { return new string[]{FirstName, LastName}; } } 

    public Customer(string FirstName, string LastName){
        this.FirstName = FirstName;
        this.LastName = LastName;
    }
}

public static void Main(string[] args)
{
    Customer c = new Customer("Adrian", "i6");

    Console.Write(JsonConvert.SerializeObject(c));
}

这当然不会完全返回所需的结果,如果您想完全删除该属性,则必须重写JsonConverter中的JsonWrite方法,但是这将导致JSON当然无效,因为JSON对象需要一个key:value属性。

DotNetFiddle runnable of the above.

答案 1 :(得分:1)

如果您想要某种“自动从JSON对象数组中派生表”功能,这种功能在任何数据类型上都是通用的,那么算法将是:

  1. 遍历数组,在进入列名时将新遇到的属性名收集到列表中。这是获取所有属性名称的唯一方法,因为可能无法保证所有对象在JSON中都具有相同的属性。
  2. 为列表中的每个对象创建一个列表
  3. 将每个对象的属性值映射到与属性名称相对应的列的列表索引中

这将为您提供两个输出工件:列列表和按索引的值。如果可以安全地假设第一个对象与Array中的所有其他对象具有相同的属性,则可以避免在第一步中遍历整个集合。这未经测试,但希望您能理解。

using System.Collections.Generic;
using Newtonsoft.Json.Linq;

// ...

var payload = JObject.Parse(rawJson);
var dataArray = payload["data"] as JArray;
var firstItem = dataArray[0] as JObject;
var columns = firstItem.Properties().Select(prop => prop.Name).ToList();
var rows = (
    from obj as JObject in dataArray
    select columns.Select(col => obj[col]).ToList()
).ToList();