如何操作 JSON 树的叶子 [英] How to manipulate leaves of a JSON tree
问题描述
我想使用 JAVA 在 JSON 树中用 _RARE_
替换稀有词.
I want to replace rare words with _RARE_
in a JSON tree using JAVA.
我的rareWords列表包含
My rareWords list contains
late
populate
convicts
所以对于下面的 JSON
So for JSON below
["S", ["PP", ["ADP", "In"], ["NP", ["DET", "the"], ["NP", ["ADJ", "late"], ["NOUN", "1700<s"]]]], ["S", ["NP", ["ADJ", "British"], ["NOUN", "convicts"]], ["S", ["VP", ["VERB", "were"], ["VP", ["VERB", "used"], ["S+VP", ["PRT", "to"], ["VP", ["VERB", "populate"], ["WHNP", ["DET", "which"], ["NOUN", "colony"]]]]]], [".", "?"]]]]
我应该得到
["S", ["PP", ["ADP", "In"], ["NP", ["DET", "the"], ["NP", ["ADJ", "_RARE_"], ["NOUN", "1700<s"]]]], ["S", ["NP", ["ADJ", "British"], ["NOUN", "_RARE_"]], ["S", ["VP", ["VERB", "were"], ["VP", ["VERB", "used"], ["S+VP", ["PRT", "to"], ["VP", ["VERB", "populate"], ["WHNP", ["DET", "which"], ["NOUN", "colony"]]]]]], [".", "?"]]]]
注意方法
["ADJ","late"]
被替换为
["ADJ","_RARE_"]
到目前为止我的代码如下:
My code so far is like below:
我递归地遍历树,一旦找到稀有词,我就会创建一个新的 JSON 数组并尝试用它替换现有树的节点.请参阅下面的 //这不起作用
,这就是我卡住的地方.树在这个函数之外保持不变.
I recursively iterate over the tree and as soon as rare word is found, I create a new JSON array and try to replace the existing tree's node with it. See // this Doesn't work
in below, that is where I got stuck. The tree remains unchanged outside of this function.
public static void traverseTreeAndReplaceWithRare(JsonArray tree){
//System.out.println(tree.getAsJsonArray());
for (int x = 0; x < tree.getAsJsonArray().size(); x++)
{
if(!tree.get(x).isJsonArray())
{
if(tree.size()==2)
{
//beware it will get here twice for same word
String word= tree.get(1).toString();
word=word.replaceAll(""", ""); // removing double quotes
if(rareWords.contains(word))
{
JsonParser parser = new JsonParser();
//This works perfectly
System.out.println("Orig:"+tree);
JsonElement jsonElement = parser.parse("["+tree.get(0)+","+"_RARE_"+"]");
JsonArray newRareArray = jsonElement.getAsJsonArray();
//This works perfectly
System.out.println("New:"+newRareArray);
tree=newRareArray; // this Doesn't work
}
}
continue;
}
traverseTreeAndReplaceWithRare(tree.get(x).getAsJsonArray());
}
}
上面调用的代码,我使用谷歌的gson
code for calling above, I use google's gson
JsonParser parser = new JsonParser();
JsonElement jsonElement = parser.parse(strJSON);
JsonArray tree = jsonElement.getAsJsonArray();
推荐答案
这是 C++ 中的直接方法:
Here's a straight forward approach in C++:
#include <fstream>
#include "JSON.hpp"
#include <boost/algorithm/string/regex.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/phoenix.hpp>
static std::vector<std::wstring> readRareWordList()
{
std::vector<std::wstring> result;
std::wifstream ifs("testcases/rarewords.txt");
std::wstring line;
while (std::getline(ifs, line))
result.push_back(std::move(line));
return result;
}
struct RareWords : boost::static_visitor<> {
/////////////////////////////////////
// do nothing by default
template <typename T> void operator()(T&&) const { /* leave all other things unchanged */ }
/////////////////////////////////////
// recurse arrays and objects
void operator()(JSON::Object& obj) const {
for(auto& v : obj.values) {
//RareWords::operator()(v.first); /* to replace in field names (?!) */
boost::apply_visitor(*this, v.second);
}
}
void operator()(JSON::Array& arr) const {
int i = 0;
for(auto& v : arr.values) {
if (i++) // skip the first element in all arrays
boost::apply_visitor(*this, v);
}
}
/////////////////////////////////////
// do replacements on strings
void operator()(JSON::String& s) const {
using namespace boost;
const static std::vector<std::wstring> rareWords = readRareWordList();
const static std::wstring replacement = L"__RARE__";
for (auto&& word : rareWords)
if (word == s.value)
s.value = replacement;
}
};
int main()
{
auto document = JSON::readFrom(std::ifstream("testcases/test3.json"));
boost::apply_visitor(RareWords(), document);
std::cout << document;
}
这假设您想对所有字符串值进行替换,并且只匹配整个字符串.通过更改正则表达式或正则表达式标志,您可以轻松地使这种情况不区分大小写,匹配字符串中的单词等. 根据评论稍作调整.
包含 JSON.hpp/cpp 的完整代码在这里:https:///github.com/sehe/spirit-v2-json/tree/16093940
The full code including JSON.hpp/cpp is here: https://github.com/sehe/spirit-v2-json/tree/16093940
这篇关于如何操作 JSON 树的叶子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!