C# JSON序列化类继承列表上的属性

C# JSON序列化类继承列表上的属性,c#,json,asp.net-web-api,json.net,C#,Json,Asp.net Web Api,Json.net,我有一个模型如下: public class TestResultModel { public bool Successful { get; set; } public string ErrorMessage { get; set; } } public class TestResultListModel : List<TestResultModel> { public int TotalTestCases { get { return base.Count

我有一个模型如下:

public class TestResultModel
{
    public bool Successful { get; set; }
    public string ErrorMessage { get; set; }
}

public class TestResultListModel : List<TestResultModel>
{
    public int TotalTestCases { get { return base.Count; } }

    public int TotalSuccessful { get { return base.FindAll(t => t.Successful).Count; } }
}
当我检查JSON结果时,它确实包含所有的
TestResultModel
s,但是
TestResultListModel
TotalTestCases
totalsuccessful
)上的属性不可见

如何在JSON序列化对象中也包含这些值


我尝试的是使用
JSON.NET
并用属性
[JsonProperty]
装饰属性,但没有成功。

您的基本困难在于JSON有两种类型的容器:对象和数组。从:

  • 数组是值的有序集合。数组以
    [
    (左括号)开始,以
    ]
    (右括号)结束。值由
    (逗号)分隔

  • 对象是一组无序的名称/值对。对象以
    {
    (左大括号)开始,以
    }
    (右大括号)结束

要强制序列化集合的属性,请将其标记为:

这使JSON看起来像:


由于这些属性可以在客户端轻松地重建,因此可能需要做的工作比它的价值还多。(这个问题建议避免这种设计。)

谢谢你详细的回答。我将重新考虑设计。:)
var testResultListModel = new TestResultListModel();
foreach (var testCaseId in new int[] {1,2,3,4})
{
    var testResultModel = new TestResultModel
    {
        Successful = true,
        ErrorMessage = "STRING"
    };

    testResultListModel.Add(testResultModel);
}
return testResultListModel;
[JsonObject]
public class TestResultListModel : List<TestResultModel>
{
    public int TotalTestCases { get { return base.Count; } }

    public int TotalSuccessful { get { return base.FindAll(t => t.Successful).Count; } }
}
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class TestResultListModel : List<TestResultModel>
{
    [JsonProperty]
    public int TotalTestCases { get { return base.Count; } }

    [JsonProperty]
    // Using Enumerable.Count() is more memory efficient than List.FindAll()
    public int TotalSuccessful { get { return this.Count(t => t.Successful); } }

    [JsonProperty]
    TestResultModel[] Items
    {
        get
        {
            return this.ToArray();
        }
        set
        {
            if (value != null)
                this.AddRange(value);
        }
    }
}
{
  "TotalTestCases": 4,
  "TotalSuccessful": 2,
  "Items": [
    {
      "Successful": false,
      "ErrorMessage": "STRING"
    },
    {
      "Successful": true,
      "ErrorMessage": "STRING"
    },
    {
      "Successful": false,
      "ErrorMessage": "STRING"
    },
    {
      "Successful": true,
      "ErrorMessage": "STRING"
    }
  ]
}