对于这个 API 响应,哪个设计更好

Which is the better design for this API response

我正在尝试为我的 API 确定最佳的回复格式。我需要 return 一个报告响应,它提供有关报告本身及其包含的字段的信息。字段可以是不同的类型,因此可以有: SelectList;文本区域;位置等..

它们各自使用不同的属性,因此 "SelectList" 可能会使用 "Value" 来存储其字符串值,而 "Location" 可能会使用 "ChildItems" 来保存 "Longitude" "Latitude"等

我的意思是:

  "ReportList": [
    {
      "Fields": [
        {
          "Id": {},
          "Label": "",
          "Value": "",
          "FieldType": "",
          "FieldBankFieldId": {},
          "ChildItems": [
            {
              "Item": "",
              "Value": ""
            }
          ]
        }
      ]
    }

这个问题是我希望用户知道什么时候值应该为空。所以我期待一个想要从 "Location" 中提取值的人从 "ChildItems" 而不是 "Value" 中提取它。然而,这样做的好处是查询事物比以下替代方案更容易:

  "ReportList": [
    {
      "Fields": [
        {
          "SelectList": [
            {
               "Id": {},
               "Label": "",
               "Value": "",
            }
          ]
          "Location": [
            {
               "Id": {},
               "Label": "",
               "Latitude": "",
               "Longitude": "",
               "etc": "",
            }
          ]
        }
      ]
    }

所以这是一个报告列表,其中包含一个字段列表,其中包含我拥有的每个字段类型(15 个或类似字段)的字段类型列表。这与仅拥有一个报告列表相反,该列表包含一个带有 "fieldtype" 枚举的字段列表,我认为这很容易操作。


所以问题:哪种格式最适合回复?任何替代方案和评论表示赞赏。


编辑:

要按字段类型查询报表中的所有字段并使用第一种方式获取值,它会像这样:

foreach(field in fields)
{
    switch(field.fieldType){
       case FieldType.Location :
           var locationValue = field.childitems;
           break;
       case FieldType.SelectList:
           var valueselectlist = field.Value;
           break;
}

第二个是这样的:

foreach(field in fields)
{
    foreach(location in field.Locations)
    {
        var latitude = location.Latitude;
    }
    foreach(selectList in field.SelectLists)
    {
        var value= selectList.Value;
    }
}  

我认为正确答案是第一个。用 switch 语句。它可以更轻松地查询以下内容:使用此 guid 的 id 获取字段的值。它只是意味着通过一个大的 switch 语句。

我选择了第一个,因为它更容易查询最常见的用例。如果他们想要更改它,我希望客户端代码将其放入他们自己的架构中。