Jackson - filtrowanie odpowiedzi.

0

Mam problem z jacksonem - parsuje JSON w androidzie, który ma ~300kb i może urosnąć, dlatego zrezygnowałem ze standardowego parsera w Androidzie i zastosowałem Jackson, lecz nie wiem jak filtrować jego odpowiedź ze względu na pole obiektu Jsona.
Przykład pliku JSON:
{"foobars":[{"foo":1,"bar":1},{"foo":2,"bar":2}]}

Domyślnie Jackson zwróci w moim przypadku ArrayList dwóch obiektów, lecz chciałbym dla powyższego przykładu dostać tylko ten obiekt, którego wartośc pola foo < 2.
Jak to zrobić?

1

http://www.jsonschema2pojo.org/ - wklejasz swojego jsona. W source type zaznaczasz Json i klikasz preview. Wygenerowane zostaną zwykłe klasy Javove, które mogą posłużyć do transformacji do pojo.
Dobrze jest się też zabezpieczyć na wypadek pustej tablicy. Można w opcjach konfiguracyjnych Jacksona ustawić ACCEPT_SINGLE_VALUES_AS_ARRAY na true.

Kod:


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Answer {

    @JsonProperty("foobars")
    private List<Foobar> foobars = new ArrayList<Foobar>();
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("foobars")
    public List&lt;Foobar&gt; getFoobars() {
        return foobars;
    }

    @JsonProperty("foobars")
    public void setFoobars(List&lt;Foobar&gt; foobars) {
        this.foobars = foobars;
    }

    @JsonAnyGetter
    public Map&lt;String, Object&gt; getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperties(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

import java.util.HashMap;
import java.util.Map;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foobar {

    @JsonProperty("foo")
    private Integer foo;
    @JsonProperty("bar")
    private Integer bar;
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("foo")
    public Integer getFoo() {
        return foo;
    }

    @JsonProperty("foo")
    public void setFoo(Integer foo) {
        this.foo = foo;
    }

    @JsonProperty("bar")
    public Integer getBar() {
        return bar;
    }

    @JsonProperty("bar")
    public void setBar(Integer bar) {
        this.bar = bar;
    }

    @JsonAnyGetter
    public Map&lt;String, Object&gt; getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperties(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

ObjectMapper mapper = new ObjectMapper();
Answer answer = mapper.readValue(twojJson,Answer.class);
List<Foobar> list = answer.getFoobars();
0

Mam swoje klasy POJO jak i klasę, która jest odpowiedzialna za parsowanie, lecz problem polega na tym, że przechwytuje ona wszystko jak leci - czyli dla przykładowego arraya foobar dodaje wszystkie obiekty (nie wiem czy to dobra nazwa) - zarówno ten, którego wartości są równe 1, jak i te których wartości są równe 2, a ja bym chciał przefiltrować odpowiedź Jacksona, tak aby dodał tylko ten obiekt, którego wartości foo są mniejsze od dwóch, czyli z przykładowej klasy tylko ten pierwszy.

1

Nie ma takiej możliwości. Jackson, Gson i inne podobne biblioteki służą tylko i wyłącznie do parsowania obiektów Json. Nie do ich filtrowania. Jeżeli chcesz uzyskać taką funkcjonalność to musisz napisać własny parser. Nie rozumiem jednak dlaczego nie możesz po prostu zrobić zwykłej pętli for i dodać do nowej kolekcji tylko te elementy, które potrzebujesz. Kilka linijek kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0