Строка JSON в OData для запроса

Как я могу превратить объект JSON, то есть { username: "john", password: "1234" }, в строковый запрос OData в функции с использованием машинописного текста? Мне не удалось найти библиотеку для этого (Angular 6). Вот моя попытка:

function ConvertToODataString (json: Object) {
    let ret_str: string = "";
    for (let key in json) {
        ret_str += (key + " = " + json[key] + "&");
    }
    if (ret_str) {
        ret_str = ret_str.substr(0, ret_str.length - 1);    // remove last &
    }
    return ret_str;
}

Кто-нибудь знает способ лучше? На данный момент мой json не является многоуровневым.

Когда вы говорите «объект JSON», вы начинаете с экземпляра объекта или со строки JSON?

ConnorsFan 18.10.2018 21:24

@ConnorsFan JSON-объект / экземпляр

xinthose 18.10.2018 21:26

Думаю, мне наверное нужно что-то более похожее на $filter=username eq 'john' and password eq '1234'.

xinthose 18.10.2018 21:30
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
3
789
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Функция JSON.parse.

Пример:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');


json = { "name":"John", "age":30, "city":"New York"};
var obj = JSON.parse(json+'');
JSON.parse преобразует строку в объект, противоположный тому, что мне нужно.
xinthose 18.10.2018 21:23

Спасибо за попытку, но JSON.stringify не будет форматировать строку для запросов OData.

xinthose 18.10.2018 21:35
Ответ принят как подходящий

Вы можете использовать для ... в для перечисления свойств объекта, добавления каждой пары ключ / значение в массив и объединения значений с Array.join:

function convertObjectToQuery(obj: Object): string {
  let values = new Array<string>();
  for (let prop in obj) {
    values.push(`${prop} eq '${obj[prop]}'`);
  }
  return encodeURI("$filter = " + values.join(" and "));
}

См. этот stackblitz для демонстрации.

Хорошая идея, хотя я думаю, что мой вопрос, вероятно, следует сформулировать по-другому, потому что я запрашиваю эти значения, поэтому мне нужен оператор $filter и другой синтаксис.

xinthose 18.10.2018 21:38

Я изменил ответ и стек в соответствии с вашими комментариями. Отредактируйте вопрос, если это тот формат, который вам нужен.

ConnorsFan 18.10.2018 21:43

Я решил использовать вместо него модуль HttpParms:

import { HttpParams } from "@angular/common/http";

const params = new HttpParams()
    .set("$filter", "Username eq '" + parameters["Username"] + "' and Password eq '" + parameters["Password"] + "'")
    .set("$count", "true");

console.info(params.toString());

Другие вопросы по теме