Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2014, 11:47   #1
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию JSON [XE7]

Добрый день!

Код:
uses System.JSON {Delphi XE7}
Код записи в JSON массив дался легко
Код:
var
  I: Integer;
  FileName: string;
  JS: TStringList;

  JSONA: TJSONArray;
  JSONV: TJSONObject;
begin
  { сохранение в JSON структуру }
  JS := TStringList.Create;
  try
    FileName := 'c:\testjson.txt'; // TPath.GetDocumentsPath + PathDelim + Block.cur + '.json';

    JSONA := TJSONArray.Create;

    { прочесываем ListView }
    for I := 0 to ListView1.Items.Count - 1 do
    begin
      with ListView1.Items[I] do
      begin
        { создаем экземпляр объекта }
        JSONV := TJSONObject.Create;
        JSONV.AddPair('Время', Caption);
        JSONV.AddPair('Валюта', subitems[0]);
        JSONV.AddPair('Важность', subitems[1]);
        JSONV.AddPair('Событие', subitems[2]);
        JSONV.AddPair('Факт.', subitems[3]);
        JSONV.AddPair('Пред.', subitems[4]);

        { добавляем в массив объектов }
        JSONA.AddElement(JSONV);
      end;
    end;

    { сохраняем JSON структуру в текст }
    JS.Text := JSONA.ToJSON;
  finally
    { сохраняем текст в файл }
    JS.SaveToFile(FileName, TEncoding.UTF8);
    FreeAndNil(JSONA);
    FreeAndNil(JS);
  end;
end;
а вот чтение не получается, в чем ошибка?
Код:
var
  I: Integer;
  FileName: string;
  JS: TStringList;

  JSON: TJSONObject;
  JSONA: TJSONArray;
  JSONV: TJSONObject;
begin
  { сохранение в JSON структуру }
  JS := TStringList.Create;
  try
    FileName := 'c:\testjson.txt'; // TPath.GetDocumentsPath + PathDelim + Block.cur + '.json';

    if FileExists(FileName) then
    begin
      JS.LoadFromFile(FileName, TEncoding.UTF8);

      { Тут -- Invalid class typecast -- }
      try
        JSON := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(JS.Text), 0) as TJSONObject;
      except
        ShowMessage('JSON Error!');
      end;

    end;
...
смысл таков, загрузить уже имеющиеся данные и добавить новых в TJSONArray
ZuBy вне форума Ответить с цитированием
Старый 09.11.2014, 12:31   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Насколько помню выгружать нужно не TJSONArray, а TJSONObject, в который этот самый массив и засунуть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.11.2014, 12:42   #3
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

тогда вопрос, как засунуть? и в чем разница?
если json структура правильная, читается онлайн парсерами
ZuBy вне форума Ответить с цитированием
Старый 09.11.2014, 12:58   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Засунуть как обычно JSONObject.AddPair('Array',JSONArra y);
Так потом нормально прочитается. В чем разница? Не совсем в курсе, полагаю что такой файл должен быть все таки {...}, а не [...] как при выгрузке массива
Ну и массив это не объект, а налицо попытка методом объекта его парсить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.11.2014 в 13:04.
Аватар вне форума Ответить с цитированием
Старый 09.11.2014, 13:27   #5
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

разница действительно есть, спасибо вам за помощь!
Код:
    { Преобразовываем в JSON Object }
    JSON := TJSONObject.Create;
    JSON.AddPair('Array', JSONArr);

    { сохранение в файл }
    with TStringList.Create do
    begin
      Text := JSON.ToJSON;
      SaveToFile(FileName);
      Free;
    end;
только при выполнении этого кода вылетает Invalid pointer operation.
на строчке
Код:
JSON.AddPair('Array', JSONArr);
как этот массив затолкать в JSON?
ZuBy вне форума Ответить с цитированием
Старый 09.11.2014, 13:33   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

У меня нет XE7. Для XE2 это работает, ну и StringList.Text:=JSONObject.ToStrin g;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.11.2014, 13:50   #7
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

сохранение то получилось, но ошибка всё равно выскакивает

разница между ToString и ToJSON только в размере файла
Цитата:
ToString
{"Array":[{"Время":"07:30","Валюта":"CNY","Ва жность":"Умеренная волатильность","Событие":"Индекс потребительских цен Китая (Ежемесячный) (окт)","Пред.":"0,5%"},
Цитата:
ToJSON
{"Array":[{"\u0412\u0440\u0435\u043C\u044F":" 07:30","\u0412\u0430\u043B\u044E\u0 442\u0430":"CNY","\u0412\u0430\u043 6\u043D\u043E\u0441\u0442\u044C":"\ u0423\u043C\u0435\u0440\u0435\u043D \u043D\u0430\u044F \u0432\u043E\u043B\u0430\u0442\u043 8\u043B\u044C\u043D\u043E\u0441\u04 42\u044C","\u0421\u043E\u0431\u044B \u0442\u0438\u0435":"\u0418\u043D\u 0434\u0435\u043A\u0441 \u043F\u043E\u0442\u0440\u0435\u043 1\u0438\u0442\u0435\u043B\u044C\u04 41\u043A\u0438\u0445 \u0446\u0435\u043D \u041A\u0438\u0442\u0430\u044F (\u0415\u0436\u0435\u043C\u0435\u04 41\u044F\u0447\u043D\u044B\u0439) (\u043E\u043A\u0442)","\u041F\u0440 \u0435\u0434.":"0,5%"},
на читаемость структуры это не влияет
ZuBy вне форума Ответить с цитированием
Старый 09.11.2014, 13:58   #8
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

нашел ошибку
Код:
  finally
    // FreeAndNil(JSONArr);
    FreeAndNil(JSON);
  end;
Аватар спасибо!
ZuBy вне форума Ответить с цитированием
Старый 09.11.2014, 14:02   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для XE
http://www.webdelphi.ru/2011/10/rabo...lphi-2010-xe2/
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XE7 Android дублирование ресурсов ZBEP Общие вопросы Delphi 3 22.11.2014 04:18
Разработка под Android (Delphi XE7) kta87 Общие вопросы Delphi 33 27.10.2014 19:15
Delphi XE5-XE7 Android нужны Учебники, Уроки,Статьи, любая помощь в изучении FomAW Общие вопросы Delphi 14 11.10.2014 01:08
Delphi XE7 & Genymotion NEoMASTERR Общие вопросы Delphi 3 04.10.2014 22:22
C++ JSON qip2005 Visual C++ 2 05.11.2012 19:48