Ich habe eine JSON-Datei, die mehrere Textfelder mit doppelten Werten enthält. Beispiel:Entfernen Sie doppelte Textwerte aus allen JSON-Arrays mit Jackson
{
"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 "
]
}
Ich möchte doppelte Werte (die Textwerte) aus allen Arrays in der JSON-Quelle entfernen. Im obigen Beispiel würden Sie die doppelten Sprachen und Tutor-Typen aus den Arrays entfernen. Die gewünschte Ausgabe wäre die obige JSON-Quelle, wobei nur die doppelten Werte entfernt werden, wo immer dies möglich ist. Außerdem möchte ich den Code nicht an einen bestimmten JSON-Feldnamen binden, sondern generell an ein Array von Textwerten. Die gewünschte Ausgabe in obigem Beispiel wäre,
{
"mName": "Carl Sanchez",
"mEmailID": "[email protected]",
"mPhoneNo": 7954041324,
"tutorTypes": [
" Freelancer/Professional Tutor",
" Coaching Institute Teacher ",
" Corporate Professional "
],
"disciplines": [
" Japanese",
" German ",
" Hindi ",
" French "
]
}
Die Eingangsquelle von JSON ist eine Datei, und ich mag die Ausgabe in einer Datei schreiben. Ich habe ein Programm versucht, diese mit Jackson Datenbindungs API zu erreichen:
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);
}
}
ich mehrere Nullen als Ausgabe immer bin. Ich habe eine Idee, warum das passieren könnte. Ich denke, wenn ich jp.nextTextValue()
rufe, ist der Parser weitergegangen und das Konstruieren eines Wertbaums könnte dazu geführt haben, aber ich bin nicht in der Lage, eine Problemumgehung dafür herauszufinden. Weiß jemand, wie ich die Aufgabe erfüllen könnte.
EDIT:
Ich will nur hier eine Sache hinzufügen - ich den Jackson-Databind API verwenden, weil es auf Streaming API gebaut wird, die effizient ist, wenn eine große JSON Quelle Parsen, die mein Fall ist. Daher würde eine Lösung, die dies berücksichtigt, geschätzt werden.