重複した値を含む複数のテキスト配列を持つJSONファイルがあります。例:ジャンクションを使用してすべてのJSON配列から重複するテキスト値を削除します。
{
"mName": "Carl Sanchez",
"mEmailID": "[email protected]",
"mPhoneNo": 7954041324,
"tutorTypes": [
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Coaching Institute Teacher ",
" Corporate Professional ",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor",
" Freelancer/Professional Tutor"
],
"disciplines": [
" Japanese",
" German ",
" Japanese",
" German ",
" Japanese",
" Hindi ",
" Japanese",
" French "
]
}
JSONソース内のすべての配列から重複した値(テキスト値)を削除します。上記の例では、配列から重複した言語とチューターの型を削除することになります。該当する出力は、上記のJSONソースで、適用可能な場合は重複値だけが削除されます。また、コードを特定のJSONフィールド名にバインドするのではなく、一般に任意の配列のテキスト値にバインドする必要があります。上記の例の出力は、
{
"mName": "Carl Sanchez",
"mEmailID": "[email protected]",
"mPhoneNo": 7954041324,
"tutorTypes": [
" Freelancer/Professional Tutor",
" Coaching Institute Teacher ",
" Corporate Professional "
],
"disciplines": [
" Japanese",
" German ",
" Hindi ",
" French "
]
}
です。入力ソースはファイルなので、出力をファイルに書きたいと思います。 私はジャクソンデータ・バインディングAPIを使用してこれを実現するためのプログラムを試みた:
public static void removeDuplicateStringElementsFromAllArrays(String file) throws IOException {
Writer fileWriter = new BufferedWriter(new FileWriter(new File("out.json")));
JsonFactory f = new MappingJsonFactory();
JsonParser jp = f.createJsonParser(new File(file));
parse(jp, fileWriter);
}
private static void parse(JsonParser jp, Writer writer) throws IOException{
JsonToken current;
current = jp.nextToken();
if(current != null){
System.out.println(current.asString());
writer.write(current.asString());
}
if(current == JsonToken.START_ARRAY){
if(jp.nextTextValue() != null){
JsonNode node = jp.readValueAsTree();
// Trim the String values
String[] values = ArraysUtil.trimArray("\"" , node.toString().split(","), "\"");
// Ensure that there is no duplicate value
values = new HashSet<String>(Arrays.asList(values)).toArray(new String[0]);
// Finally, concatenate the values back and stash them to file
String concatValue = String.join(",", values);
// Write the concatenated values to file
writer.write(concatValue);
}
else{
parse(jp, writer);
}
}
else{
// Move on directly
parse(jp, writer);
}
}
私は出力として、いくつかのNULLを取得しています。私はなぜこれが起こっているのかという考えを持っています。私はjp.nextTextValue()
と呼んだとき、パーサーが動いて、値ツリーを構築している可能性がありますが、これに対する回避策を見つけることができません。誰もが知っている、私はどのようにタスクを達成するために行くかもしれない。
EDIT:
ただ、ここで一つのことを追加したい - それは私の場合である大JSONソースを、解析時に効率的でストリーミングAPI上に構築されているので、私はジャクソンのDataBind APIを使用しています。したがって、これを考慮に入れた解決策が認められるでしょう。