Java读取Word脚注、尾注_第1张图片

  但不得不说教程写的不太全,网上资料也很少,大都重复教程的范畴。

  项目中有个蛋疼的需求要把JSON字符串中值为空的键值对去掉,C++下处理字符串本就难受,幸亏有RapidJson帮忙。

  参考教程有基本函数说明,处理逻辑代码如下:

  // 递归处理json内部空元素void HandleChild(Value object) { for (Value::ConstMemberIterator itr = object.MemberBegin(); itr != object.MemberEnd();) { if (itr-value.IsObject()) {

  HandleChild(object[itr-name]);

  } if (itr-value.IsNull() || itr-value == || itr-value.Empty()) {

  itr = object.EraseMember(itr);

  } else {

  itr++;

  }

  }

  }// 处理json体,排除其中为空的元素std::string HandleJsonString(const char* jsonString) {

  Document document;

  document.Parse(jsonString); for (Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd();) { if (itr-value.IsObject()) {

  HandleChild(document[itr-name]);

  } if (itr-value.IsNull() || itr-value == || itr-value.Empty()) {

  itr = document.EraseMember(itr);

  } else {

  itr++;

  }

  } // 转回字符串返回

  StringBuffer buffer;

  Writerwriter(buffer);

  document.Accept(writer); return buffer.GetString();

  }

  { // 传入字符串,排空处理

  postParm = HandleJsonString((char*)jsonString.data());

  }

  首先是HandleJsonString方法,该方法用于接收要处理的json字符串,解析成RapidJson的Document类型的JSON树之后,就可以利用迭代器遍历来判断每个元素值(Value)是否为空了。如果遇到空的,则从document中移除,注意移除后,迭代器会指向后一个元素,所以此时迭代器不能递增。全部判断处理完后,就可以转回字符串来返回了。

  需要注意的是,这样的遍历只能处理JSON体最外层的元素是否为空,对于多层结构的JSON体就不能判断了,所以需要HandleChild来递归处理。

  HandleChild接收的参数要注意为引用形式,这样才能保证修改的是原结构体数据。

  在HandleJsonString中,遇到Object类型的元素,表示还有内部结构体,所以就将其传入HandleChild中,在HandleChild中递归的时候也是一样的判断逻辑,如果遇到Object,则递归调用。同时每次都判断元素值是否为空值、空字符串或者空Object、Array等。这样才能保证去除干净,否则会出现一个节点内部元素都为空,全部去除后,这个元素还留着。

  举个例子,这样一个JSON:

  { name:cloudox,

  sex:boy,

  age:,

  skill:{

  ios:true,

  cpp:true

  go:

  } hobby:{ dev:

  }

  }

  处理后应该变成:

  { name:cloudox,

  sex:boy,

  skill:{

  ios:true,

  cpp:true

  }

  }