Перейти к содержанию
  • 0
rareMax

Маршалинг массива, в котором данные разных типов

Вопросы

Я работаю с библиотекой XSuperObject. Как правило, сам JSON я не парсю, а только создаю классы-прототипы данных в JSON, и пользуюсь методами .FromJSON и .ToJSON.

пример:

Для такого JSON'a 

Цитата

{
    "response" : {
        "text" : "SP4K – Million (Feat. Thomas Mraz)",
        "audio" : {
            "id" : 456239199,
            "owner_id" : 2000261195,
            "artist" : "SP4K",
            "title" : "Million (Feat. Thomas Mraz)",
            "duration" : 208,
            "date" : 1464166093,
            "url" : "http:\/\/cs613628.vk.me\/u1768845\/audios\/f266e0328a98.mp3",
            "album_id" : 2,
            "genre_id" : 18
        }
    }
}
 

создаю такой класс:

TvktStatus = Class
  private
    Ftext: String;
    FAudio: TvktAudio;
  published
    [Alias('text')]
    property text: String read Ftext write Ftext;
    [Alias('audio')]
    property audio: TvktAudio read FAudio write FAudio;
  End;

в итоге не нужно парсить программисту - все делает библиотечка. 

Теперь к самой проблеме.

Допустим есть такой файлик с данными в формате JSON:

Цитата

{
    "response" : 
                [
                    [1, "а"], 
                    [2, "б"], 
                    [3, "в"], 
                    [4, "г"], 
                    [5, "д"],  
                    [102, 15]
                ]
}

Как бы вы составили такой класс-прототип? Ведь тут получается в одном массиве есть как число так и строка.

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


Ссылка на сообщение

Рекомендуемые сообщения

  • 0
2 минуты назад, krapotkin сказал:

как вариант, можно предложить препроцессинг, заменяя 15 на "15"

Ну за это я думал - просто все равно в одном массиве будет сразу Integer, потом String ([5, "д"],). Можете подсказать как тут поступить лучше? 

 

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


Ссылка на сообщение
  • 1

тут однозначно лучше всего просто разбор без FromJSON

ибо RTTI хочет название поля, а его тут нет. XSuperJson такое не съест

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


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От rareMax
      Нужно сериализовать объект. Проблема в том, что бы поля, значения которых nil - нужно вообще исключить из итогового JSON. Использую System.Json.Serializers. Пробовал сделать это через свой IJsonContractResolver - но там я не смог проверить значение. Знаю что можно свой конвертер для каждого типа написать - но это довольно объемная работа получится. Есть ли у вас варианты, как можно решить мой вопрос?
      JSON-Serialize-Experiments/IgnoreIfNil.dpr at main · ms301/JSON-Serialize-Experiments (github.com)
    • От gresaggr
      Добрый день.
      Пытаюсь парсить следующую структуру (в архиве файл test.json) через XSuperObject 
      в jSonData находится содержимое файла архива. 
      var
        X: ISuperObject;
        jSonData: string;
      ...
      if jSonData <> '' then
        try
          X := SO(jSonData);
        except
          print('jSonData: ' + jSonData);
            result := 'PARS ERROR';
          exit;
        end;
       
      выдает ошибку на моменте  "... \u0438 60":"40\n\u0417..."
      Как можно исправить?
      test.zip
    • От rareMax
      Как убрать поле класса из сериализации через Rest.Json?
      Вот как я пробую избавиться от поля Foo:
      program Project1; {$APPTYPE CONSOLE} {$R *.res} uses REST.Json, System.JSON.Serializers, System.SysUtils; type TFoo = class private FValue1: Integer; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; end; [JsonSerialize(TJsonMemberSerialization.&Public)] TBar = class private FValue1: Integer; FFoo: TFoo; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; // property Foo: TFoo read FFoo write FFoo; end; procedure Test; var LBar: TBar; begin LBar := TBar.Create; try Writeln(TJson.ObjectToJsonString(LBar)); finally LBar.Free; end; end; begin try { TODO -oUser -cConsole Main : Insert code here } Test; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Но на выходе все равно есть поле Foo.
       
    • От ENERGY
      Друзья, нашел тут интересную статью, где тестируются разные jSON парсеры.
       
      Ссылка: http://www.webdelphi.ru/2016/10/ishhem-samyj-bystryj-parser-json-v-delphi/
      Автор: Владислав Баженов
      Описание (26/10/2016):
       
    • От unicorn
      Всем привет. 
      Мне нужно отправить запрос к серверу в формате JSON-RPC. Вопрос - как в него запихнуть json-данные правильно?
    • От Просто Проги
      Пытаюсь получить список друзей из вк получаю их по api записываю в memo.text ответ от get запроса,после пытаюсь получить из json поля
      ответ выглядит так
      { "response": { "count": 104, "items": [ { "id": 1308603, "first_name": "Виктория", "last_name": "Талина", "photo": "http://cs625517.vk.me/v625517603/4e79b/E9Q1WA5SSLiI.jpg", "photo_100": "http://cs625517.vk.me/v625517603/4e79a/15QwerpQbCKk.jpg", "photo_400_orig": "http://cs625517.vk.me/v625517603/4e7199/wxOJQyZhqq8.jpg", "online": 0 }, { "id": 282070, "first_name": "Никита", "last_name": "Багров", "photo": "http://cs630623.vk.me/v630623070/4b610/RXNNdJ6_Nik.jpg", "photo_100": "http://cs630623.vk.me/v630623070/4b60f/MDXpi0deY1A.jpg", "photo_400_orig": "http://cs630623.vk.me/v630623070/4b60e/ec7A3pBDJZ0.jpg", "online": 0 }, "first_name": "Имя ", Следующим кодом
       
      var JSON: TJSONObject; JSONArray: TJSONArray; i: Integer; begin JSON := TJSONObject.ParseJSONValue(Form2.Memo2.Lines.Text) as TJSONObject; сюда получается я заношу весь код Form2.Memo2.Lines.Clear; JSONArray := TJSONArray(JSON.Get('items').JsonValue); далее изу по массиву итмемов for i := 0 to JSONArray.Size - 1 do begin Form2.Memo2.Lines.Add(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('first_name')).JsonValue.Value); пытаюсь добавить найденное поле end; но летят ошибка критичная (
    • От rareMax
      Поддерживает ли стандартная библиотека маршалинг/демаршалинг классов? Сейчас работаю с XSuperObject - работа очень приятная с ним. Но огорчает то, что тащит за собой тяжелые библиотеки(Инди, БД). Если нет - может кто знает альтернативы полегче? В идеале будет если так же будут Marshalling Attributes
    • От M1shQa
      Получаю с сервера большой JSON, в нем есть поле number. Как получить список в memo состоящий только из номеров? Подскажите пожалуйста..
       
    • От Dion
      Добрый день, Господа.
      Давайте меняться. 
      Предлагаю вам откуда-то взятый мною superobject, версии 1.2 из которой я выкинул разный хлам, допилил и сделал так, чтобы он собирался под Android, OS X и iOS. Протестировал.
      Дальше я написал вокруг него километр кода, создал набор стилей и сделал динамическую загрузку стилей для списка. В список в соответствии со стилями можно добавить порядка 20 разных компонентов.
      Идея моя была такой.
      Есть сервер, на него с клиента загружаются стили и дальше они разливаются от сервера к серверу и в конечном счете попадают на клиентов. Грубо говоря, должен получиться тонкий клиент.
      Надо кому? 
    • От Axbor
      TJSONObject *o = dynamic_cast<TJSONObject*> (TJSONObject::ParseJSONValue(TEncoding::ASCII->GetBytes(s), 0)); if (!o) return; TJSONArray *a = dynamic_cast<TJSONArray*>(o->Get("M")->JsonValue); if (!a) return; for (int i = 0; i < a->Count; i++) { TJSONObject *b = dynamic_cast<TJSONObject*>(a->Get(i)); if (! return; Jokes[i + CurrPos].Caption = b->Pairs[0]->JsonValue->ToString(); Jokes[i + CurrPos].Content = b->Pairs[1]->JsonValue->ToString(); Count++; } delete L; L = 0;  "s" это текст которая хранит JSON внутри значений которого есть символ " (кавычка). В JONS е уже добавлены BackSlash перед такими символами. При парсинге JOSN опят добавляются BackSlash перед спец символами. Как от этого избежать?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...