Доступ к полям массива JSON с использованием RapidJSON в C++

Я новичок в использовании библиотеки RapidJSON, и я хочу знать, как я могу получить доступ к определенным элементам в массиве в формате JSON, это JSON:

{
  "products": [
    {
      "id_product": 1,
      "product_name": "Beer",
      "product_price": 120.00
    },
    {
      "id_product": 2,
      "product_name": "Pizza",
      "product_price": 20.00
    }
  ]
}

У меня есть эта часть кода, чтобы сделать:

Document json_value;
json_value.Parse(json_message); //Above Json

if(!json_value.IsObject())
{
    //ERROR
}

if(json_value.HasMember("products"))
{       
    const Value& a = json_value["products"];

    if(a.IsArray())
    {
        for (SizeType i = 0; i < a.Size(); i++)
        {
            //Here i dont know how to access the elements of the array elements, but i need something like this:
            int element_id = 1; //id_product = 1
            string element_name = "Beer"; // product_name = "Beer"
            float element_price = 120.00; //prodcut_price = 120.00
        }
    }
}

3 ответа

Решение

Вы можете получить доступ к элементам объекта, используя operator[](),

for (SizeType i = 0; i < a.Size(); i++)
{
    if (a[i].IsObject()) {
        int element_id = a[i]["id_product"].GetInt();
        string element_name = a[i]["product_name"].GetString();
        double element_price = a[i]["product_price"].GetDouble();
    }
}

Обратите внимание, что вы можете захотеть добавить проверки типа и существования члена, если ваш JSON не всегда согласован.

Так как для каждого "продукта" в products это объект, вы также можете перебрать каждую пару ключ-значение следующим образом:

const Value& products = json_value["products"];
for (auto& product: products) {  // products is type Array
   for (auto& prod : product.GetObject()) {
      std::cout << prod.name  // similar to map->first
                              // i.e "id_product", "product_name"
                << prod.value // similar to map->second
                              // i.e 2, "Pizza"
                << std::endl;
   }
}

Я верю, что вы можете просто позвонить operator[]() с беззнаковым int, если значение является массивом. Учебник появляется, чтобы подтвердить это:

const Value& a = document["a"];
assert(a.IsArray());
for (SizeType i = 0; i < a.Size(); i++) // Uses SizeType instead of size_t
        printf("a[%d] = %d\n", i, a[i].GetInt());

Вы также можете получить итераторы, используя MemberBegin() а также MemberEnd(),

Другие вопросы по тегам