Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Массив olevariant в json  [new]
Dmitry_PV
Member

Откуда:
Сообщений: 51
Не тривиальная задача необходимо
Массив olevariant(елементы массива то же варианты тип ни где не задан явно)
в масиве может быть что угодно в пределах разумного(датасетпровайдер,массив вариантов просто массив и тд)

сконвертировать в json

проблема с которой столкнулся
как понять какого типа элемент массива пробую через VarType (но выдаёт какую то белеберду)

разработка delphi 6.

Может кто то с таким сталкивался или делал что то подобное.


------------------------------------
Не воспринимайте доброту за слабость
5 сен 18, 11:13    [21665246]     Ответить | Цитировать Сообщить модератору
 Re: Массив olevariant в json  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1807
Dmitry_PV,

1. Я бы создал объектную модель уже со всеми типами элементов, которые только могут быть в OLEVariant
2. Эту объектную модель заполнял бы из OLEVariant
3. Сериализовывал объектную модель в Json
5 сен 18, 11:28    [21665275]     Ответить | Цитировать Сообщить модератору
 Re: Массив olevariant в json  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3846
Это проблема. Стоит рассмотреть другие варианты обмена информацией. Например, сразу хранить данные в json, использовать обычные массивы или взять универсальные контейнеры (из делфи или сторонние).
5 сен 18, 11:36    [21665285]     Ответить | Цитировать Сообщить модератору
 Re: Массив olevariant в json  [new]
Василий 2
Member

Откуда:
Сообщений: 238
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Variant.Type ?
5 сен 18, 14:33    [21665738]     Ответить | Цитировать Сообщить модератору
 Re: Массив olevariant в json  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
Dmitry_PV
пробую через VarType (но выдаёт какую то белеберду)
Что именно возвращается?
5 сен 18, 15:15    [21665822]     Ответить | Цитировать Сообщить модератору
 Re: Массив olevariant в json  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6270
Dmitry_PV,

Dmitry_PV
как понять какого типа элемент массива пробую через VarType (но выдаёт какую то белеберду)


посмотрите может эти функции сработают:
  • SafeArrayGetVarType
  • SafeArrayGetElement
  • 5 сен 18, 15:43    [21665882]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    Так сериализации добился.
    Остался вопрос изменить кодировку для delphi 6 есть примеры какие-нибудь?
    5 сен 18, 16:02    [21665923]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    меняем на UTF8
    5 сен 18, 16:03    [21665925]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    Dmitry_PV,

    разобрался сам спс.
    теперь обратный процесс
    десериализация полученного json обратно в olevariant.
    5 сен 18, 16:41    [21665995]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Кроик Семён
    Member

    Откуда: СПб --> Dortmund
    Сообщений: 6270
    Правила хорошего тона требует теперь рассказать, в чем бяла проблема и как решил. Форум - это немного howto
    5 сен 18, 17:22    [21666036]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Кроик Семён
    Member

    Откуда: СПб --> Dortmund
    Сообщений: 6270
    опечатка, "была"
    5 сен 18, 17:23    [21666037]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    Кроик Семён,

    проблема была в том что используя VarType не много не так.
    а надо было

    procedure varAsstr(var rezu : OleVariant;var JsonList:Tstringlist);
    var
     v:Variant;
    begin
    for i:=VarArrayLowBound(rezu,1) to VarArrayHighBound(rezu,1)   do
    begin
     v:=rezu[i];
        str:='';
    
        case VarType(v) of
        varEmpty:   begin  str_type:='varEmpty'; str:=''; end;
        varNull:    begin  str_type:='varNull'; str := '<NULL>';                end;
        varSmallInt:begin  str_type:='varSmallInt'; str := IntToStr(V);             end;
        varInteger: begin  str_type:='varInteger'; str := IntToStr(V);             end;
        varSingle:  begin  str_type:='varSingle'; str := FloatToStr(V);           end;
        varDouble:  begin  str_type:='varDouble'; str := FloatToStr(V);           end;
        varCurrency:begin  str_type:='varCurrency'; str := CurrToStr(V);            end;
        varDate:    begin  str_type:='varDate'; str := DateTimeToStr(V);        end;
    


    ну а дальше собираем стринглист по всем правилам формирования json.
    5 сен 18, 17:35    [21666047]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    _Vasilisk_
    Member

    Откуда: Украина, Харьков
    Сообщений: 10598
    Dmitry_PV
    а надо было
    Учитывая, что вы все равно используете системные форматы и разделители, что мешало сделать так?
    v:=rezu[i];
    v_type = VarType(v);
    str_type = VarTypeAsText(v_type);
    if v_type = varNull then
      str := '<NULL>'
    else
      str := v;
    
    5 сен 18, 17:58    [21666083]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    _Vasilisk_,

    это типо замена case?
    5 сен 18, 18:03    [21666090]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    _Vasilisk_,

     varVariant: begin  str_type:='varVariant'; str := '<Variant>';             end;
        varDispatch:begin  str_type:='varDispatch'; str := '<varDispatch>';         end;
        varUnknown: begin  str_type:='varUnknown'; str := '<varUnknown>';          end;
    


    а вот это как впихнуть сюда тогда?
    5 сен 18, 18:06    [21666091]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    _Vasilisk_
    Member

    Откуда: Украина, Харьков
    Сообщений: 10598
    Dmitry_PV
    а вот это как впихнуть сюда тогда?

    v:=rezu[i];
    v_type = VarType(v);
    str_type = VarTypeAsText(v_type);
    case v_type of
      varNull: str := '<NULL>';
      varVariant: str := '<Variant>';
      varDispatch: str := '<varDispatch>';
      varUnknown: str := '<varUnknown>';
    else
      str := v;
    end;
    
    5 сен 18, 18:13    [21666099]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    _Vasilisk_,

    согласен.
    5 сен 18, 18:20    [21666104]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Василий 2
    Member

    Откуда:
    Сообщений: 238
    FloatToStr даст тебе веселые ощущения и нарушение формата на системе с десятичным разделителем "," (и не только)
    6 сен 18, 12:00    [21666732]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    Василий 2,

    нормально все переводит с "," остаются
    6 сен 18, 13:06    [21666844]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Василий 2
    Member

    Откуда:
    Сообщений: 238
    Dmitry_PV
    Василий 2,

    нормально все переводит с "," остаются

    Вот именно. А теперь скорми получившийся json ему и полюбуйся на результат
    6 сен 18, 14:30    [21667010]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Мимопроходящий
    Member

    Откуда: бурятский тундрюк, эсквайр
    Сообщений: 29231

    06.09.2018 14:30, Василий 2 пишет:
    > А теперь скорми получившийся json ему https://codebeautify.org/jsonvalidator и полюбуйся на результат

    они там кофе просят.
    слёзно.
    ты купил им?

    Posted via ActualForum NNTP Server 1.5

    6 сен 18, 14:48    [21667037]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    Василий 2,

    ругается но проблема в том что не понятно на что.
    6 сен 18, 19:07    [21667418]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Мимопроходящий
    Member

    Откуда: бурятский тундрюк, эсквайр
    Сообщений: 29231

    06.09.2018 19:07, Dmitry_PV пишет:
    > ругается но проблема в том что не понятно на что.

    сеня, забей (С)
    если ты сторишь объект им.ЖОЙСОНа как строку, то пофиг.

    Posted via ActualForum NNTP Server 1.5

    6 сен 18, 19:12    [21667422]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Василий 2
    Member

    Откуда:
    Сообщений: 238
    Dmitry_PV
    Василий 2,

    ругается но проблема в том что не понятно на что.

    Ругается он на твою запятую. Потому как json - это формат, на который есть установленный стандарт. И в стандарте этом десятичный разделитель - точка. А в твоем варианте результат зависит от настроек системы: вот поставит юзер, чтобы у него дробная часть отделялась буквой Ы - и привет. На другой системе ты файл не прочитаешь
    6 сен 18, 20:06    [21667450]     Ответить | Цитировать Сообщить модератору
     Re: Массив olevariant в json  [new]
    Dmitry_PV
    Member

    Откуда:
    Сообщений: 51
    Василий 2,

    Интересная теория.И даже это было бы именно так если бы это была др система, но нет это будет та же система и сериализатор будет написан там же , а по сему я думаю что могу не обращять внимание на запятую.😂😂😂
    7 сен 18, 08:08    [21667644]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Delphi Ответить