Вопрос

 Есть ли более адекватный компонент, чем TJSONObject?

 

Меня он не устраивает тем, что он не может распарсить запить типа: {"data":["val1", "val2", "val3"]}. Тоесть я могу получить строку по ключу "data", но ее саму мне приходится парсить вручную.

И еще одно: при неудачном парсинге, он не вызывает экзепшн. Тоесть обнаружить ошбку можно только при последующей работе или дополнительными костылями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 0

считывай как JSONPair

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

И как?

data := '{"ok":true,"data":["var1","var2"]}';
JSON := TJSONObject.ParseJSONValue(data) as TJSONObject;
Pair := JSON.GetValue('data') as TJSONPair; //ошибка
data := '{"ok":true,"data":["var1","var2"]}';
JSON := TJSONObject.ParseJSONValue(data) as TJSONObject;
JSON1 := TJSONObject.ParseJSONValue(JSON.GetValue('data').Value) as TJSONObject; //ошибка

 

Изменено пользователем sviat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Кажется нашел TJSONArray. Пошел тестить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Как у него обстоят дела с юникодом? ну там типа /u20000/u352121

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 1

Вот пример кода для вашего случая

Var Source : String;
    JSON : TJSONObject;
    JSONValue : TJSONValue;
    JSONArray : TJSONArray;
    I : Integer;
begin
  Source:='{"data":["val1", "val2", "val3"]}';
  JSON:=TJSONObject(TJSONObject.ParseJSONValue(Source));
  if Not Assigned(JSON) then
    Exit;
  if JSON.TryGetValue('data',JSONValue) then
    if TJSONObject(JSONValue).ClassName.Equals('TJSONArray') then
    begin
      JSONArray:=TJSONArray(JSONValue);
      if Assigned(JSONArray) then
        for I := 0 to JSONArray.Count-1 do
          Memo.Lines.Add(JSONArray.Items[I].Value);
    end;
end;

Для проверок неудачного парсинга есть такие инструменты как "if Assigned(JSON) then" и "JSON.TryGetValue('data',JSONValue)"

Rusland, Brovin Yaroslav, sviat9440 и 1 другому понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Всем спасибо. Щас буду пробовать ..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу