代码之家  ›  专栏  ›  技术社区  ›  Muflix

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

  •  0
  • Muflix  · 技术社区  · 8 年前

    对于这个班级

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

    不做任何事

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

    ?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Adrian    8 年前

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

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

    用修饰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.

        2
  •  1
  •   Jacob    8 年前

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

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

    这将为您提供两个输出工件:列列表和按索引的值。如果可以安全地假设第一个对象与数组中的所有其他对象具有相同的属性,那么在第一步中可以避免迭代整个集合。这是未经测试,但希望你得到要点。

    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();