Проблема
Судя по контексту вашего вопроса, вы хотите удалить «», чтобы иметь правильный формат JSON.
Для части синтаксического анализа JSON вы должны использовать библиотеку. Я собираюсь опубликовать пример этого здесь, в ближайшее время.
Решение
Для этого мы воспользуемся функцией std::replace
из библиотеки <algorithm>
; хотя мы можем реализовать это самостоятельно, лучше использовать стандартные библиотеки, так как их создатели много работали над оптимизацией этих функций до самых полных возможностей. Итак, давайте возьмем ваш код, который вы нам дали из вопроса, и сделаем его подходящим для JSON.
#include <algorithm>
#include <string>
#include <iostream>
using std::string;
using std::cout;
using std::endl;
void convert_char(string &s,char from_conv, char to_conv) {
std::replace( s.begin(), s.end(), from_conv, to_conv); // replace all 'x' to 'y'
}
int main()
{
string str = "{ \n \
\"key1\": [[\"1\", 0.4], [\"0\", 0.6]], \n \
\"key2\": true, \n \
\"key3\": 1, \n \
\"key4\": [{\"key41\": 1}, {\"key42\": [1,2,3]}] \n }";;
convert_char(str,'\"',(char)0);
cout << str << endl;
}
Как видите, у нас есть функция convert_char
, которая преобразует один символ в другой. Итак, в основном, как вы задали вопрос, мы удалили двойную кавычку, и тада, она отформатирована как JSON! Посмотрите здесь демоверсию.
Решение для парсера JSON
Очевидно, здесь вы будете использовать библиотеку, которая сделает это за вас. Я собираюсь представить вам sciter
! По сути, с sciter
все, что вам нужно сделать, это:
#include <algorithm>
#include <string>
#include <iostream>
#include <sciter>
using std::string;
using std::cout;
using std::endl;
int main()
{
string str = "{ \n \
\"key1\": [[\"1\", 0.4], [\"0\", 0.6]], \n \
\"key2\": true, \n \
\"key3\": 1, \n \
\"key4\": [{\"key41\": 1}, {\"key42\": [1,2,3]}] \n }";;
sciter::value str_conv = sciter::value::from_string( str, CVT_JSON_LITERAL );
cout << str_conv << endl;
}
Теперь, согласно этому коду, код в формате JSON находится в str_conv
! Ссылки, которые помогут вам в этом, находятся ниже в разделе «Ссылки».
Использованная литература:
sciter
cpprefrence std::replace
string::replace
cpprefrence std::refrence_if
Глоссарий
std::replace
:
Прототип:
template <class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last,
const T& old_value, const T& new_value); //source cpprefrence
ссылки: cpprefrence
<algorithm>
:
Многие темы находятся внутри библиотеки алгоритмов. Это библиотека для, как вы уже догадались, алгоритмов.
Заголовок <algorithm>
определяет набор функций, специально разработанных для использования с диапазонами элементов.
Диапазон — это любая последовательность объектов, к которым можно получить доступ через итераторы или указатели, например массив или экземпляр некоторых контейнеров STL. Заметьте, однако, что algorithms
работает через iterators
непосредственно со значениями, не влияя никоим образом на структуру любого возможного контейнера (это никогда не влияет на размер или распределение памяти контейнера).
Библиотека алгоритмов определяет функции для различных целей (например, поиска, сортировки, подсчета, манипулирования), которые работают с диапазонами элементов.
Использованная литература:
cplusplus
cppreference
person
amanuel2
schedule
08.10.2016