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

Rest OData协议是否提供了将对象数组转换为原始值数组的方法?,rest,odata,Rest,Odata,在OData查询中是否有一种方法可以指定返回原始数组,而不是返回某些名称/值对?例如,如果我有一个OData查询,结果如下: { “@odata.context”:”http://blah.org/MyService/$metadata#人“, “价值”:[ { “姓名”:“乔·史密斯”, “年龄”:55岁, “雇主”:[ { “名称”:“Acme”, “起始日期”:“1990年1月1日” }, { “名称”:“安然”, “开始日期”:“1995年1月1日” }, { “名称”:“亚马逊”, “

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

{
“@odata.context”:”http://blah.org/MyService/$metadata#人“,
“价值”:[
{
“姓名”:“乔·史密斯”,
“年龄”:55岁,
“雇主”:[
{
“名称”:“Acme”,
“起始日期”:“1990年1月1日”
},
{
“名称”:“安然”,
“开始日期”:“1995年1月1日”
},
{
“名称”:“亚马逊”,
“开始日期”:“1999年1月1日”
}
]
},
{
“姓名”:“无名氏”,
“年龄”:30岁,
“雇主”:[
{
“名称”:“乔的螃蟹小屋”,
“开始日期”:“2007年1月1日”
},
{
“名称”:“TGI星期五”,
“开始日期”:“2010年1月1日”
}
]
}
]
}
我是否可以向查询中添加任何内容以取而代之:

{
“@odata.context”:”http://blah.org/MyService/$metadata#人“,
“价值”:[
{
“姓名”:“乔·史密斯”,
“年龄”:55岁,
“雇主”:[
[“Acme”,“1/1/1990”],
[“安然”,“1/1/1995”],
[“亚马逊”,“1/1/1999”]
]
},
{
“姓名”:“无名氏”,
“年龄”:30岁,
“雇主”:[
[“乔的螃蟹小屋”,“1/1/2007”],
[“TGI周五”、“2010年1月1日”]
]
}
]
}

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

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

在ODatav4中,您可以将
OData.metadata=minimal
添加到
Accept
标题参数中(查看文档)。这是默认行为,但即使如此,它仍将在响应中包含字段名,这是有充分理由的

我可以理解为什么只发送值而不发送字段名,但请记住,这将改变响应结构的语义。这将降低在客户端作为json记录处理的直观性

所以要回答你的问题,答案是‘不’

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

您可以使用$valueOData选项获取单个属性的原始值。 检查此示例:


您还可以使用$select选项,通过选择要包含在响应中的属性子集来仅拾取所需的字段,从而在所需输出中创建不同类型的值数组。这通常不是我会做的事情。我认为这会损害你的API。这将导致发送的数据减少,是的。但是,这也会导致API不太清晰,客户必须在API中做出假设(如果名称看起来不像日期,则雇主数组中数组的第一个字段应为名称)。其次,这会使工作变得更加困难,客户无法通过明确要求来检索雇主的姓名或起始日期;请记住,我正在寻找一种使用查询从标准ODataAPI显式请求此格式的方法,以避免此格式成为API本身的一部分,即确定此格式的同一客户端将是解释结果的客户端。FWIW,我的实际用例由图表的X,Y值组成;我希望接收像[12345,77]这样的元组数组,而不是像{timestamp:12345,value:77}这样的对象数组。你有没有找到一种方法来实现这一点?谢谢;不幸的是(afaik)$value关键字只适用于单个值,而我正在寻找可以在一个数组中转换多个值的东西;基本上相当于
result.map(obj=>[obj.Name,obj.StartDate])
。你是对的。它只适用于单个值。我深入研究了OData文档,找到了OData.metadata=minimal format参数。它还表明,你的问题的答案是“不”,正如我在修订后的回答中所描述的,这是一个很好的理由,谢谢你的研究。正如我在对另一条评论的回复中提到的,我并不太担心回复格式是非直观的,因为它将由客户指定返回内容的格式;默认响应仍然是标准的。