【问题标题】:How to create json string from C# list of object with specific properties?如何从具有特定属性的 C# 对象列表创建 json 字符串?
【发布时间】:2018-09-02 11:12:48
【问题描述】:

考虑我在下拉列表中有以下值(dropDownList 变量),用户选择的值在selectedDropDownValues 列表中。

DB api 返回客户列表(customerDBList 变量)。

现在的要求是从下面提到的选定值构建 JSON -

var dropDownList = new[] { "Customer.Id", "Customer.FirstName", "Customer.LastName", "Customer.Address.AddressLine1", "Customer.Address.AddressLine2" };

var selectedDropDownValues = new[] { "Customer.Id", "Customer.FirstName", "Customer.Address.AddressLine1" };

var customerDBList = new List<Customer>(){
                new Customer {
                    Id=1,
                    FirstName="John",
                    LastName="Desouza",
                    Address=new Address{            
                                AddressLine1="1 Street",
                                AddressLine2="Linking Road"
                    }},        
                new Customer {
                    Id=2,
                    FirstName="Sam",
                    LastName="Lewis",
                    Address=new Address{            
                                AddressLine1="Fedral Highway",
                                AddressLine2="Louisville"
                    }                
                }};

预期的 JSON 输出为 -

[
  {
    "Customer": {
      "Id": 1,
      "FirstName": "John",
      "Address": {
        "AddressLine1": "1 Street"
      }
    }
  },
  {
    "Customer": {
      "Id": 2,
      "FirstName": "Sam",
      "Address": {
        "AddressLine1": "Fedral Highway"
      }
    }
  }
]

【问题讨论】:

  • 您能否澄清一下您是否希望将两条地址线放在一起?您的示例显示了这两种方式。
  • 不,我想要根据 selectedDropDownValues 中的选定值
  • 我已经更新了 JSON。

标签: c# json list c#-3.0


【解决方案1】:

碰巧的是,您的selectedDropDownValues 字符串"Customer.Address.AddressLine1" 采用JSONPath 语法,因此您可以将Customer 对象转换为中间JObject,然后使用JsonExtensions.RemoveAllExcept(this JObject obj, IEnumerable&lt;string&gt; paths) 将不需要的值从this answer 修剪为How to perform partial object serialization providing "paths" using Newtonsoft JSON.NET.

请注意,您所需的 JSON 具有额外级别的嵌套 { "Customer": { ... } },您的数据模型中不存在,因此需要在过滤之前手动插入:

var rootName = "Customer";

var query = customerDBList
    // Convert to JObject
    .Select(c => JObject.FromObject(c))
    // Add additional level of object nesting { "Customer": { ... } } 
    .Select(o => new JObject( new JProperty(rootName, o)))
    // Remove all but selected properties.
    .Select(o => o.RemoveAllExcept(selectedDropDownValues));

var json = JsonConvert.SerializeObject(query, Formatting.Indented);

工作示例 .Net fiddle here 显示生成的 JSON 是,根据需要,

[
  {
    "Customer": {
      "Id": 1,
      "FirstName": "John",
      "Address": {
        "AddressLine1": "1 Street"
      }
    }
  },
  {
    "Customer": {
      "Id": 2,
      "FirstName": "Sam",
      "Address": {
        "AddressLine1": "Fedral Highway"
      }
    }
  }
]

【讨论】:

    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2015-05-23
    • 1970-01-01
    • 2017-01-04
    • 2013-11-10
    相关资源
    最近更新 更多