对于本课程
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
});
}
?
答案 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属性。
答案 1 :(得分:1)
如果您想要某种“自动从JSON对象数组中派生表”功能,这种功能在任何数据类型上都是通用的,那么算法将是:
这将为您提供两个输出工件:列列表和按索引的值。如果可以安全地假设第一个对象与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();