27

jackson を使用してデシリアライズする必要があるクラスがあり、そのクラスにはコレクション プロパティがあります。コレクションは空ですが、null ではありません。質問:空のコレクションなしでクラスをデシリアライズする方法。以下のサンプルコード:

class Person
{
    String name;
    List<Event> events;
    //....getter, setter
}

もしも

person.list = new List<Event>(); 
persion.name = "hello";

次に、jsonが次のようになることを除いて:

{name: "hello"}

いいえ

{name: "hello", events:[]}

作り方は?ありがとう~~

================================================

n1ckolas のアドバイスでこれを解決しました。最初にありがとう。私のjackson のバージョンは 2.1.1 で、Spring-3.2.2 はこのバージョンの jackson のより良いサポートをインポートします。また、これは配列とコレクションの両方で機能します。 以下は私の設定です:

<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>
    </mvc:message-converters>        
</mvc:annotation-driven>

<!--Json Mapper-->
<bean name="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" autowire="no">
    <property name="featuresToDisable">
        <list>
            <!--not to return empty colletion-->
            <value type="com.fasterxml.jackson.databind.SerializationFeature">WRITE_EMPTY_JSON_ARRAYS</value>
        </list>
    </property>
</bean>
4

7 に答える 7

13

Jackson アノテーションを使用して元のモデルを変更できる場合は、これを実現する方法を次に示します。

ジャクソンにはWRITE_EMPTY_JSON_ARRAYSがあります。そして、あなたはそれをオフにすることができます:

objectMapper.configure(SerializationConfig.Feature.WRITE_EMPTY_JSON_ARRAYS, false);

ただし、 に対してのみ機能しArrays、 に対しては機能しませんCollections。ただし、次のように@JsonPropertyと組み合わせることができます。@JsonIgnore

//....getter, setter of Person class
@JsonIgnore
public List<Event> getEvents() {
    return events;
}

@JsonProperty("events")
public Event[] getEventsArr() {
    return events.toArray(new Event[0]);
}

その後、期待どおりに出力が得られます。

編集:SpringMVCを使用している場合はObjectMapper、明示的な参照を使用して実際のを構成できますmvc:annotation-driven:

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<!--custom Json Mapper configuration-->
<bean name="objectMapper" class="org.springframework.http.converter.json.JacksonObjectMapperFactoryBean" autowire="no">
    <property name="featuresToDisable">
        <list>
            <!--Ignore unknown properties-->
            <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_EMPTY_JSON_ARRAYS</value>
        </list>
    </property>
</bean>

Offtop:通常、 の明示的なインスタンスを指定すると非常に便利ですObjectMapper。理由は次のとおりです。

  • 好きなように設定できます
  • その参照を使用できます@Autowired
于 2013-03-15T09:21:01.447 に答える
6

Spring Boot を使用している場合はapplication.properties、以下を追加するだけです。

spring.jackson.serialization-inclusion=NON_EMPTY
于 2016-08-12T15:51:02.960 に答える
1
  1. ここのように、JSONビューを使用できます:Jackson-プロパティのシリアル化(書き込み)を動的に抑制します

  2. これを行う別の方法は、別のクラスを定義することです。これは、とほぼ同じPersonですが、eventsプロパティはありません。次に、コレクションの値に基づいて、元のオブジェクトをシリアル化するPersonか、代替のevents-lessオブジェクトをシリアル化するかを決定できます。これは私見よりも単純で、上記のケースでは機能するはずですが、最初の選択肢ほど柔軟ではありません。

于 2013-03-15T09:15:32.670 に答える
0

@JsonInclude(JsonInclude.Include.NON_EMPTY) クラスレベルでこれを含めると、次のことが行われます。

  1. null 以外の値のみを含める
  2. 空でないリストのみを含める
于 2020-03-03T09:07:13.130 に答える