Запись большого массива в одну строку с использованием StyledWriter jsoncpp

Я использую jsoncpp для чтения и записи файлов json.

Для записи я использую StyledWriter, который записывает json в удобном для человека виде.

В настоящее время я пытаюсь записать массив целых чисел в файл json. В документации описаны следующие правила записи значения массива:

  • если пусто, то выведите [] без отступа и разрыва строки
  • если массив не содержит значения объекта, пустой массив или какие-либо другие типы значений, и все значения помещаются в одну строку, то выведите массив в одну строку.
  • в противном случае, если значения не помещаются в одну строку, или массив содержит объект или непустой массив, то выведите одно значение на строку.

Поскольку массив, который я пытаюсь написать, слишком велик для одной строки, согласно приведенным выше правилам, писатель печатает его по одному значению в строке, что делает мой json уродливым и менее читаемым. Я бы предпочел записать весь массив в одну строку или в несколько строк с несколькими значениями в строке.

Я знаю о том, что jasoncpp имеет открытый исходный код, и поэтому я могу изменить автора, чтобы он делал то, что хочу, но мне интересно, есть ли другой способ сделать это. Возможно, используя как FastWriter (который создает однострочный json), так и StyledWriter?


person White Zebra    schedule 03.07.2012    source источник
comment
Открыть задачу. Это может быть добавлено в качестве новой функции.   -  person cdunn2001    schedule 17.02.2015


Ответы (2)


Вы должны использовать FastWriter следующим образом:

Json::Value your_json(Json::objectValue);
//init your json...
Json::FastWriter fastWriter;
fastWriter.write(your_json)
person Hesham Yassin    schedule 20.09.2015

Посмотрите на json_writer.cpp — два метода writeIndent().

void 
StyledStreamWriter::writeIndent()
{
  /*
    Some comments in this method would have been nice. ;-)

   if ( !document_.empty() )
   {
      char last = document_[document_.length()-1];
      if ( last == ' ' )     // already indented
         return;
      if ( last != '\n' )    // Comments may add new-line
         *document_ << '\n';
   }
  */
//Removing indent and line feed!!!   *document_ << '\n' << indentString_;
}

void 
StyledWriter::writeIndent()
{
   if ( !document_.empty() )
   {
      char last = document_[document_.length()-1];
      if ( last == ' ' )     // already indented
         return;
//Removing indent and line feed!!!      if ( last != '\n' )    // Comments may add new-line
//Removing indent and line feed!!!         document_ += '\n';
   }
   document_ += indentString_;
}
person Johnny Programmer    schedule 07.06.2013