Halli Hallo
Ich suche einen JSON Parser, welcher mit ReferenzHandlung umgehen kann. Hintergrund ist der, das ich ein JSON File bekommen habe, welches mit Json.NET erstellt wurde und dieses nun mit Java deserialisieren muss (siehe auch http://james.newtonking.com/json/help/index.html?topic=html/PreserveObjectReferences.htm für ein Beispiel)
Hat da jemand einen guten Tipp welche Library das kann, oder kann das so ziemlich jede, bzw. ein Tipp wie man das Problem lösen könnte?
Grüße
Jackson kann das. Schau dir das JsonIdentityInfo für weitere Infos an.
Ui, das ging fix. Werd mir das mal anschauen, danke schonmal
Hab mir das nun mal angesehen und es läuft soweit, das einzige was noch fehlt ist das Referenzieren. Wenn ich mir da ein Testfall baue, sieht das wie folgt aus
{
"Zweiter":{"$id":1,"name":"Ich",},
"Erster":1
}
Mein Ausgangscode baut da aber noch eine Variable ein
{
"Zweiter":{"$id":1,"name":"Ich",},
"Erster": {
"$ref": "1"
}
}
Wenn ich das nun mit dem JSOG Plugin versuche auszulesen kommt immer die Exception “(was java.lang.NullPointerException) (through reference chain)”. Wie krieg ich das nun hin das Jackson den $ref Wert ausliest, ohne das ich die Quelldatei vorher durchparsen muss? Sind immerhin ~700k Zeilen
Hier wären mehr infos (z.B. quellcode + genaue Fehlermeldung) interessant. Prinzipiell kümmert sich Jackson darum, dass die Referenzen richtig zugewiesen werden:
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JacksonKSKB{
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Demo demo = new Demo();
demo.setA(new Person());
demo.setB(demo.getA());
demo.getA().setName("Karl");
String out = mapper.writeValueAsString(demo);
System.out.println(out);
Demo demo1 = mapper.readValue(out, Demo.class);
System.out.println(demo1.getA() == demo1.getB());
}
public static class Demo {
private Person a;
private Person b;
public Person getA() {
return a;
}
public void setA(Person a) {
this.a = a;
}
public Person getB() {
return b;
}
public void setB(Person b) {
this.b = b;
}
}
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "$id")
public static class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}```
Der Fehler kam aus einem der Jackson Plugin JSOG https://github.com/jsog/jsog-jackson, also nicht direkt aus dem Core Teil. Ich vermute das die zugewiesenen ID’s bzw dann die “$ref” Werte dazu irgendwie corrupt waren. Werd mir das nochmal genauer ansehen.
Mein aktuelles Problem ist nämlich, auch in deinem Code, das die Referenzen in From von {"a":{"$id":1,"name":"Karl"},"b":1}
vorliegen. Die Quelle hat aber als Format {"a":{"$id":1,"name":"Karl"},"b": { "$ref":"1"}}
Und wie ich das bisher rausbekommen habe, gibt es keine Möglichkeit den erweiterten Fall dem ObjectMapper irgendwie beizubringen
€:
Ändere ich die Person und den Generator zu
@JsonIdentityInfo(generator = JSOGGenerator.class, property = "$id")
@JsonIgnoreProperties({"@ref"})
public static class Person {...
Wird ausgegeben das die beiden Objekte nicht gleich sind. Und lass ichdas ignore weg wird das “@ref” Feld als fehlende angezeigt Unrecognized field "@ref" (class testing.jackson.JSOGDemo$Person), not marked as ignorable (2 known properties: "name", "$id"])