欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

rapidjson指针

程序员文章站 2024-02-02 18:31:04
...

博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidjson指针/

本系列文章以例子的方式进行呈现。

#include "rapidjson/document.h"
#include "rapidjson/pointer.h"

#include <iostream>

using namespace rapidjson;

/*
*     Json Pointer
*     一个Json Pointer有一串(0至多个)token所组成,每个token之前都有/前缀。每个token
*     可以是字符串或者数字。例如,给定一个json:{
*                                            "foo":["bar", "baz"],
*                                            "pi":3.414
*                                           }
*                               JsonPointer解析为:
*                               1. "/foo"->["bar", "baz"]
*                               2."/foo/0"->"bar"
*                               3."/foo/1"->"baz"
*                               4."pi"->3.414
*       特别注意:一个空Json Pointer""解析为整个json
*/

int main()
{
  Document d;

  /*          创建、修改、访问dom元素
  *           创建dom元素的方法: (两种都可以自动生成父值,可以同时创建几级)
  *               1.Pointer("/Key").Set(document, "value"); key对应值为value
  *               2.Pointer("/Key").Create(document). 此时创建出来的key对应的值为null
  *           获取Dom元素的pointer:
  *                1.Value* vptr = Pointer("/Key").Get(document)
  *                2.Value& vref = Pointer("/Key").GetWithDefault(document, "defaultValue");
  *                       注意返回的是引用,如值不存在,则创建此键并深拷贝默认值。
  *           交换:
  *                 Pointer("/Key").Swap(document, value); //注意交换的是Value,不能为其他类型
  *            删除:
  *                 Pointer("/Key").Erase(document);
  */

  /*            针对上述函数的辅助函数
  *           SetValueByPointer(document, "/Key", "KeyValue");
  *           CreateValueByPointer(document, "/Key");
  *           GetValueByPointer(document, "/Key");
  *           GetValueByPointerWithDefault(document, "/default", "defaultValue");
  *           SwapValueByPointer(document, "/Key", Value); //必须为Value
  *           EraseValueByPointer(document, "/Key");
  */

  /*          Pointer相关函数说明
  *           1.Pointer::Get() 或 GetValueByPointer() 函数并不修改 DOM。
  *                  若那些 token 不能匹配 DOM 里的值,这些函数便返回 nullptr。
  *                  使用者可利用这个方法来检查一个值是否存在。
  *           2. Create()、GetWithDefault()、Set()、Swap()都会改变Dom.
  *                  若一些父值不存在,就会创建它们。若父值类型不匹配 token,
  *                   也会强行改变其类型。改变类型也意味着完全移除其 DOM 子树的内容
  */

  /*
  *         Pointer中负号解析
  *         1.在Get中,负号永远都是Key的名字
  *         2.在Set中,若负号在数组的后面,则表示数组最后一个元素的下一个
  *                   否则表示数组名。例:
  *         d.Parse("{\"foo\":[123]}");
  *         SetValueByPointer(d, "/foo/-", 456); // { "foo" : [123, 456] }
  *         SetValueByPointer(d, "/-", 789);    // { "foo" : [123, 456], "-" : 789 }
  */

  /*      字符串化
  *     可以将一个Pointe字符串化,存储于字符串或者其他输出流。
  *     如:
  *     Pointer p(...);
  *     StringBuffer sb;
  *     p.StringFy(sb);
  *     std::cout << sb.GetString() << std::endl;
  */


  Pointer("/project").Set(d, "RapidJson");
  Pointer("/stars").Set(d, 10);

  std::cout << d["project"].GetString() << std::endl;
  std::cout << d["stars"].GetInt() << std::endl;
  if (Value* stars = Pointer("/stars").Get(d))
  {
    stars->SetInt(stars->GetInt() + 1);
  }
  std::cout << d["stars"].GetInt() << std::endl;

  Pointer("/default").GetWithDefault(d, "defaultValue");

  if (d.HasMember("default"))
    std::cout << d["default"].GetString() << std::endl;

  Value swapValue("SwapValue");
  Pointer("/default").Swap(d, swapValue);
  std::cout << d["default"].GetString() << std::endl;
  Pointer("/default").Erase(d);
  if (!d.HasMember("default"))
    std::cout << "d Erase default successful" << std::endl;


}
相关标签: rapidjson