2013-08-04 18 views
13

Mam fasoli jak tenJak odwijać i serializować mapę java w języku Java za pomocą jackson?

class Foo { 
    private Map<String, Data> dataMap; 
    private String fooFieldOne; 
    private String fooFieldTwo; 
} 

class Data { 
    private fieldOne; 
    private fieldTwo; 
} 

chcę serializacji jako JSON, jak się ten

{ 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

ale otrzymuję wynik jak

{ 
    "dataMap": { 
     "key1": { 
      "fieldOne": "some value", 
      "fieldTwo": "some value" 
     }, 
     "key2": { 
      "fieldOne": "some other value", 
      "fieldTwo": "some other value" 
     } 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

jak ignorować warstwę Datamap w powyższy json? Używam do tego biblioteki java jackson.

Kod próbowałem to

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject) 

Odpowiedz

10

Można by utworzyć getter dla Datamap i serializacji Datamap zamiast całego Foo instancji.

mapper.writeValueAsString(myFOOObject.getDataMap()); 

Inna metoda polega na użyciu adnotacji @JsonUnwrapped. Ta adnotacja jest dostępna w Jackson 1.9+.

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/annotate/JsonUnwrapped.html

Minusem korzystania z tej adnotacji jest niezdolność do wykorzystania mapy jak stwierdzono w answer to your other question

+0

Witaj Bart, Dziękuję bardzo za szczegółową odpowiedź. Ale mam też inne pola w mojej fasoli. Rozważmy, że Foo ma inne pola fooFieldOne, fooFieldTwo wraz z już posiadaną mapą. Chcę serializować wszystko jako pojedynczy obiekt, taki jak {"klucz1": {"fieldOne": "pewna wartość", "fieldTwo": "pewna wartość"}, "key2": {"fieldOne": "inna wartość", " fieldTwo ":" inna wartość "}," fooFieldOne ":" valueone "," fooFieldTwo ":" valuetwo "}. Jak sobie z tym poradzić? – suren

+0

Zaktualizowałem odpowiedź, aby dołączyć adnotację @JsonUnwrapped. – Bart

2

Otrzymujesz

{ "dataMap": ... } 

ponieważ Foo ma pole nazwie dataMap wewnątrz niej. Tutaj nazwa pola nie mogą być ignorowane ponieważ stworzy konflikty razie Foo miał wiele map, coś

class Foo { 
private Map<String, Data> dataMap1; 
private Map<String, Data> dataMap2; 
} 

teraz nie mając fieldName: w JSON, JSON nie wiem jak deserializowania gdy robi się trochę JSON jak

{ 
    //belongs to dataMap1 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    //belongs to dataMap2 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
} 

teraz posiadające fieldName czyni bardzo jasne podczas deserializacji

{ 
    "dataMap1" : { 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    } 
    }, 
    "dataMap2" : { 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
    } 
} 

Mimo, że

Jak ignorować Datamap warstwę w json?

Można tylko szeregować mapę

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject.getDataMap()); 
+0

Dziękuję bardzo za szczegółową odpowiedź. Rozumiem, co się dzieje w moim przypadku. Ale mam inne pola w mojej fasoli. Rozważmy, że Foo ma inne pola fooFieldOne, fooFieldTwo oraz posiadaną mapę. Chcę serializacji wszystko jako pojedynczego obiektu jak { "key1": { "fieldOne": "Niektóre wartości", "fieldTwo": "pewną wartość" }, "Klawisz2": { "fieldOne": " inna wartość ", " fieldTwo ":" inna wartość " }," fooFieldOne ":" valueone "," fooFieldTwo ":" valuetwo " }. Jak sobie z tym poradzić? – suren

+0

Myślę, że nie jest to możliwe, ponieważ pole mapy zawsze będzie miało jakąś nazwę (nie będziemy mieć pola bez nazwy) i na pewno będzie ono przechwycone w JSON – sanbhat

+0

@sanbhat Jest to możliwe przy użyciu '@ JsonUnwrapped'. – Bart

0

Na mapie nie ma dwóch obiektów String i Data. JSON konwertuje obiekty java do pary wartości kluczy JSON, ale jeśli już posiadasz Mapę zawierającą parę wartości kluczy i konwertujesz tę mapę na dokument JSON, to klucz mapy jest również konwertowany na parę kluczy JSON, a wartość Map również ma obiekt które zamieniają się w parę wartości klucza.

0

znalazłem odpowiedź - używając @JsonAnyGetter adnotacji z getter na mapie. Aby uniknąć konfliktów podczas deserializacji, należy użyć adnotacji @JsonAnySetter z ustawiaczem dla tej mapy.

Powiązane problemy