2015-11-12 3 views
2

У меня есть JSon файл, который выглядит следующим образомИсключить JSon свойство на основе определенного значения с помощью Джексоном

{ 
    "items" : [ { 
    "Name" : "India", 
    "FullName" : "India", 
    "Region" : "Asia" 
    }, { 
    "Name" : "USA", 
    "FullName" : "United States of America", 
    "Region" : "Americas" 
    }, { 
    "Name" : "UK", 
    "FullName" : "United Kingdon", 
    "DisplayLabel" : "Europe" 
    } ] 
} 

Pojo класс выглядит следующим образом

Countries.java

package model; 

import com.fasterxml.jackson.annotation.JsonProperty; 
import javax.xml.bind.annotation.XmlElement; 

public class Countries { 

    @XmlElement(required = true) 
    @JsonProperty("Name") 
    private String name; 

    @XmlElement(required = true) 
    @JsonProperty("FullName") 
    private String fullName; 

    @XmlElement(required = true) 
    @JsonProperty("Region") 
    private String region; 

    public Countries(@JsonProperty("Name") String name, 
       @JsonProperty("FullName") String fullName, 
       @JsonProperty("Region") String region) { 
     this.name = name; 
     this.fullName = fullName; 
     this.region = region; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setFullName(String fullName) { 
     this.fullName = fullName; 
    } 

    public String getFullName() { 
     return fullName; 
    } 

    public void setRegion(String region) { 
     this.region = region; 
    } 

    public String getRegion() { 
     return region; 
    } 
} 

Items.java

package model; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 

import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Items { 
    public Items() { 
     super(); 
    } 

    @XmlElement(required = true) 
    @JsonProperty("items") 
    protected List<Countries> view; 


    public void setView(List<Countries> view) { 
     this.view = view; 
    } 

    public List<Countries> getView() { 
     return view; 
    } 

} 

I Я использую API-интерфейсы jackson. Использование ObjectMapper для сериализации json. Пример.

Items views = mapper.readValue(jsonString, Items.class); 

Я не могу исключить те записи, которые имеют Регион = "Европа". Как достичь этого. Заранее спасибо.

+4

Я думаю, вы пытаетесь использовать Джексона слишком много ... Это в первую очередь для управления трансляцией между POJO и JSON ... то, что вы хотите сделать, это логика приложения ... Просто перейдите по списку и удалите пункты ... – Adam

ответ

1

Лучшее, что я мог бы прийти с, обычай Deserialiser что отфильтровывает регионы (что, очевидно, может оказаться под любой "Region" или "DisplayLabel"), но коллекция результат будет содержать нулевые элементы, которые требуют постобработки должны быть удалены:

Вот полный пользовательский десериализатор

package model; 

import java.io.IOException; 

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonDeserializer; 
import com.fasterxml.jackson.databind.JsonNode; 

public class CountriesDeserializer extends JsonDeserializer<Countries> { 
    @Override 
    public Countries deserialize(JsonParser p, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException 
    { 
     String region = null; 
     JsonNode countryNode = p.getCodec().readTree(p); 
     JsonNode regionNode = countryNode.get("Region"); 
     if (regionNode == null) regionNode = countryNode.get("DisplayLabel"); 
     if (regionNode != null) region = regionNode.asText(); 
     if ("Europe".equals(region) == false) { 
      return new Countries(countryNode.get("Name").asText(), 
        countryNode.get("FullName").asText(), region); 
     } 
     return null; 
    } 
} 

это должно быть указано на коллекции имущества Items класса:

@XmlElement(required = true) 
@JsonProperty("items") 
@JsonDeserialize(contentUsing = CountriesDeserializer.class) 
protected List<Countries> view; 

результатом вызова ObjectMapper является коллекция с одной нулевой записью.

+0

Не большая разница, но я думаю, что вы также можете указать пользовательский десериализатор при создании объекта mapper, не используя аннотацию. Преимущество в том, что оно не всегда применяется и может игнорироваться, если вы не хотите фильтровать в определенных случаях. –

2

Джексон должен быть ориентирован на сериализацию и десериализацию, не выполняя логику приложения вне этой области. Скорее всего, вам лучше десериализовать контент, а затем повторить через объекты, чтобы применить ваши критерии.

List<Country> nonEuropean = views.getView().stream() 
     .filter(c -> !c.getRegion().equals("Europe")) 
     .collect(Collectors.toList()); 

Архитектурно, сохраняя объем Джексона, содержащийся в переводе JSON в Java и Vis-Versa позволяет использовать один и тот же Джексон конфигурации на протяжении всего проекта. В вашем текущем использовании вы хотите опустить европейские страны, но в другой области вашего приложения вы можете включить эти объекты.

Смежные вопросы