2016-11-03 4 views
0

Есть ли способ указать в 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" ] 
     ] 
    } 
    ] 
} 

В то время как я, очевидно, мог бы сделать преобразование на стороне клиента, в моем случае имена полей очень большие по сравнению с данными, и я предпочел бы не передавать все эти имена по кабелю и не проводить циклы процессора на клиенте, выполняющем преобразование. Прежде чем я придумаю свои собственные параметры, чтобы указать, что формат должен быть таким, каким я хочу, я хотел проверить, не был ли стандартизированный способ сделать это.

+0

В нужной продукции вы делаете массивы разные типы значений. Обычно это не то, что я сделал бы. На мой взгляд, это повредит вашему API. Это приведет к уменьшению количества отправленных данных, да. Однако это также приведет к менее понятному API, в котором клиентам придется делать предположения (первое поле массива в Мастере работодателей должно быть именем, если оно не похоже на дату). Рядом с этим с ним сложно работать, клиент не может просто получить имя или StartDate работодателя, задав его особым запросом. – ophychius

+0

Согласен; имейте в виду, что я ищу способ явно запросить этот формат из стандартного API OData с помощью запроса, чтобы * не * сделать этот формат частью моего самого API, то есть тот же клиент, который определяет этот формат, будет один интерпретирует результаты. FWIW, мой фактический прецедент состоит из значений X, Y для диаграммы; вместо массива таких объектов, как {timestamp: 12345, value: 77}, я бы хотел получить массив кортежей вроде [12345,77]. –

ответ

0

OData предоставляет несколько опций для управления количеством данных и метаданных, которые должны быть включены в ответ.

В OData v4, вы можете добавить odata.metadata=minimal к параметрам заголовка в Accept (проверьте документацию here). Это поведение по умолчанию, но даже при этом оно все равно будет содержать имена полей в ответе и по уважительной причине.

Я вижу, почему вы хотите отправлять только значения без имени полей, но имейте в виду, что это изменит семантический смысл структуры ответа. Это сделает его менее интуитивным, чтобы иметь дело с записью json на стороне клиента.

Так, чтобы ответить на ваш вопрос, ответ «НЕТ»,

Других вариантов, чтобы минимизировать размер ответа:

Вы можете использовать $ значения варианта OData к получает необработанное значение а одно свойство. Проверьте этот пример: services.odata.org/OData/OData.svc/Categories(1)/Products(1)/Supplier/Address/City/$value

Вы также можете использовать опцию $ выбрать для вишни выбрать только те поля, которые нужны, выбрав подмножество свойств включить в ответ

+0

Thanks; К сожалению (afaik) ключевое слово $ value работает только с одиночными значениями, тогда как я ищу что-то, что может преобразовать несколько значений в массив; в основном эквивалент 'result.map (obj => [obj.Name, obj.StartDate])'. –

+0

Вы правы. Он будет работать только для одного значения. Я углубился в документацию OData и нашел параметр odata.metadata = минимальный формат. Это также говорит о том, что ответ на ваш вопрос «НЕТ» и по уважительной причине, как я описываю в своем пересмотренном ответе – Yoram

+0

Спасибо, что посмотрели на него. Как я уже упоминал в своем ответе на другой комментарий, я не слишком обеспокоен тем, что формат ответа не интуитивно понятен, так как это будет клиент, определяющий формат возвращаемого; ответ по умолчанию будет по-прежнему стандартным. –