在 C# 中将选项列表转换为 JavaScript 参数

本文关键字:转换 JavaScript 参数 列表 选项 | 更新日期: 2023-09-27 17:56:11

>我需要获取如下所示的JSON字符串:

{"1":[{"value":"1", "text":"Basketball"}, {"value":"2", "text":"Tennis"}, {"value":"3", "text":"Football"}],"3":[{"value":"4", "text":"futbol"}]}

负责生成此函数的 C# 代码如下所示:

var sportsEntries = new Dictionary<byte, List<KeyValuePair<int, string>>>();
foreach (var department in Departments)
{
  var deptOptions = SportList
    .Where(x => x.DeptId == department.DeptId)
    .ToDictionary(x => x.SportId, x => x.SportNameName).ToList();
  sportsEntries .Add(department.DeptId, deptOptions);
}
var json = JsonConvert.SerializeObject(sportsEntries);

遗憾的是,此方法会生成错误的 JSON。JSON 如下所示:

{"1":[{"Key":1,"Value":"Basketball"},{"Key":2,"Value":"Tennis"},{"Key":3,"Value":"Football"}],"3":[{"Key":4, "Value":"Futbol"}]}

我觉得我离得很近。但是,我不确定如何更新我的 C# 代码以使生成的 JSON 看起来像我需要的格式。如何更新 C# 以输出正确的 JSON?

谢谢!

在 C# 中将选项列表转换为 JavaScript 参数

你可以使用这样的东西:

var sportsEntries = new Dictionary<byte, List<object>();
foreach (var department in Departments)
{
   var deptOptions = SportList
     .Where(x => x.DeptId == department.DeptId)
     .Select(x => new { value = x.SportId, text = x.SportNameName}).ToList();
   sportsEntries .Add(department.DeptId, deptOptions);
}
var json = JsonConvert.SerializeObject(sportsEntries);

此解决方案将初始KeyValuePair<int, string>替换为 object,并创建具有所需属性的匿名对象列表。

这有效:

[TestFixture]
public class SoTest
{
    [Test]
    public void Test1()
    {
        var departments = new List<Department>
        {
            new Department
            {
                DeptId = 1
            }
        };
        var sportList = new List<Sport>
        {
            new Sport
            {
                DeptId = 1,
                SportId = 1,
                SportName = "Basketball"
            },
            new Sport
            {
                DeptId = 1,
                SportId = 2,
                SportName = "Tennis"
            }
        };
        var sportsEntries = new Dictionary<byte, List<Kvp>>();
        foreach (var department in departments)
        {
            var deptOptions = sportList
                .Where(x => x.DeptId == department.DeptId)
                .Select(x => new Kvp { Value = x.SportId, Text = x.SportName }).ToList();
            sportsEntries.Add(department.DeptId, deptOptions);
        }
        string json = JsonConvert.SerializeObject(sportsEntries);
        Assert.IsNotNullOrEmpty(json);
        Debug.Print(json);
    }
}
public class Department
{
    public byte DeptId { get; set; }
}
public class Sport
{
    public byte DeptId { get; set; }
    public int SportId { get; set; }
    public string SportName { get; set; }
}
[DataContract]
public class Kvp
{
    [DataMember(Name = "value")]
    public int Value { get; set; }
    [DataMember(Name = "text")]
    public string Text { get; set; }
}