OData协议是否提供了将对象数组转换为原始值数组的方法?

时间:2016-11-03 17:56:06

标签: rest odata

是否有一种方法在OData查询中指定,而不是返回某些名称/值对,而应返回原始数组?例如,如果我有一个OData查询导致以下结果:

{
  "@odata.context": "http://blah.org/MyService/$metadata#People",
  "value": [
    {
      "Name": "Joe Smith",
      "Age": 55,
      "Employers": [
        {
          "Name": "Acme",
          "StartDate": "1/1/1990"
        },
        {
          "Name": "Enron",
          "StartDate": "1/1/1995"
        },
        {
          "Name": "Amazon",
          "StartDate": "1/1/1999"
        }
      ]
    },
    {
      "Name": "Jane Doe",
      "Age": 30,
      "Employers": [
        {
          "Name": "Joe's Crab Shack",
          "StartDate": "1/1/2007"
        },
        {
          "Name": "TGI Fridays",
          "StartDate": "1/1/2010"
        }
      ]
    }
  ]
}

我可以在查询中添加任何内容而不是返回:

{
  "@odata.context": "http://blah.org/MyService/$metadata#People",
  "value": [
    {
      "Name": "Joe Smith",
      "Age": 55,
      "Employers": [
        [ "Acme", "1/1/1990" ],
        [ "Enron", "1/1/1995" ],
        [ "Amazon", "1/1/1999" ]
      ]
    },
    {
      "Name": "Jane Doe",
      "Age": 30,
      "Employers": [
        [ "Joe's Crab Shack", "1/1/2007" ],
        [ "TGI Fridays", "1/1/2010" ]
      ]
    }
  ]
}

虽然我显然可以进行转换客户端,但在我的用例中,字段名称与数据相比非常大,我宁愿不通过线路传输所有这些名称,也不会在客户端上花费CPU周期来执行转型。在我提出自己的自定义参数以表明格式应该符合我的要求之前,我想检查一下是否已经有了标准化的方法。

1 个答案:

答案 0 :(得分:0)

OData提供了几个选项来控制要包含在响应中的数据量和元数据量。

在OData v4 中,您可以将odata.metadata=minimal添加到Accept标头参数中(请查看文档here)。这是默认行为,但即使这样,它仍然会在响应中包含字段名称,这是有充分理由的。

我可以看到为什么你只想发送没有字段名称的值,但请记住,这会改变响应结构的语义。它将使得在客户端处理json记录时不那么直观。

所以回答你的问题,答案是'不',

最小化响应大小的其他选项:

您可以使用 $ value OData选项获取单个属性的原始值。 检查此示例: services.odata.org/OData/OData.svc/Categories(1)/Products(1)/Supplier/Address/City/$value

您还可以使用 $ select 选项,通过选择要包含在响应中的属性子集来选择您需要的字段