81

JSON応答を返すSpring Webサービスがあります。ここに示す例を使用してサービスを作成しています: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

json が返される形式は次のとおりです: {"name":null,"staffName":["kfc-kampar","smith"]}

返された応答から null オブジェクトを削除したいので、次のようになります: {"staffName":["kfc-kampar","smith"]}

ここで同様の質問がされているのを見つけましたが、解決策を得ることができました。

Spring での ObjectMapper の構成

spring アノテーションベースの構成を使用しているときに MappingJacksonHttpMessageConverter を構成する方法は?

spring mvc 3でjacksonObjectMapperが機能しない構成

json応答で「null」オブジェクトを返さないようにspring mvc 3を構成する方法は?

Spring は @ResponseBody JSON 形式を構成します

Jackson+Spring3.0.5 カスタム オブジェクト マッパー

これらのソースやその他のソースを読んだ結果、私が望んでいたことを達成するための最もクリーンな方法は、Spring 3.1 と mvc-annotation 内で構成できるメッセージ コンバーターを使用することであることがわかりました。私の更新された春の設定ファイルは次のとおりです。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

<context:component-scan base-package="com.mkyong.common.controller" />

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="prefixJson" value="true" />
            <property name="supportedMediaTypes" value="application/json" />
            <property name="objectMapper">
                <bean class="org.codehaus.jackson.map.ObjectMapper">
                    <property name="serializationInclusion" value="NON_NULL"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

サービス クラスは、mkyong.com サイトで指定されているものと同じですが、Shop name 変数の設定をコメント アウトして null にしています。つまり、

@Controller
@RequestMapping("/kfc/brands")
public class JSONController {
    @RequestMapping(value="{name}", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody Shop getShopInJSON(@PathVariable String name) {
        Shop shop = new Shop();
        //shop.setName(name);
        shop.setStaffName(new String[]{name, "cronin"});
        return shop;
    }
}

私が使用している Jackson jar は、jackson-mapper-asl 1.9.0 と jackson-core-asl 1.9.0 です。これらは、mkyong.com からダウンロードした spring-json プロジェクトの一部として提供されている、pom に追加した唯一の新しい jar です。

プロジェクトは正常にビルドされますが、ブラウザからサービスを呼び出すと、{"name":null,"staffName":["kfc-kampar","smith"]} という同じ結果が返されます

設定のどこが間違っているのか誰か教えてもらえますか?

他にもいくつかのオプションを試しましたが、JSON を正しい形式で返すことができた唯一の方法は、オブジェクト マッパーを JSONController に追加し、"getShopInJSON" メソッドで文字列を返すようにすることです。

public @ResponseBody String getShopInJSON(@PathVariable String name) throws JsonGenerationException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);

    Shop shop = new Shop();
    //shop.setName(name);
    shop.setStaffName(new String[]{name, "cronin"});
    String test = mapper.writeValueAsString(shop);
    return test;
}

ここでサービスを呼び出すと、予想される {"staffName":["kfc-kampar","cronin"]} が得られます

@JsonIgnore アノテーションを使用して動作させることもできましたが、このソリューションは私には適していません。

コードでは機能するのに構成では機能しない理由がわかりません。

4

10 に答える 10

116

Jackson 2.0以降、JsonIncludeを使用できます

@JsonInclude(Include.NON_NULL)
public class Shop {
    //...
}
于 2014-12-16T20:07:15.687 に答える
104

Jackson が使用されているため、Jackson プロパティとして構成する必要があります。Spring Boot REST サービスの場合は、application.propertiesまたはで構成する必要がありapplication.ymlます。

spring.jackson.default-property-inclusion = NON_NULL

ソース

于 2016-04-09T09:58:22.753 に答える
14
@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)
public class Shop {
    //...
}

jackson 2.0 以降で使用する場合@JsonInclude(Include.NON_NULL)

これにより、空のオブジェクトと null オブジェクトの両方が削除されます。

于 2015-12-31T06:31:04.100 に答える
4

すべての非 xml 設定ユーザー向け:

ObjectMapper objMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
HttpMessageConverter msgConverter = new MappingJackson2HttpMessageConverter(objMapper);
restTemplate.setMessageConverters(Collections.singletonList(msgConverter));
于 2015-12-31T04:53:53.903 に答える
3

バージョン 1.6 以降、新しいアノテーション JsonSerialize があります (たとえば、バージョン 1.9.9)。

例:

@JsonSerialize(include=Inclusion.NON_NULL)
public class Test{
...
}

デフォルト値は常にです。

古いバージョンでは、新しいバージョンでは非推奨になっている JsonWriteNullProperties を使用できます。例:

@JsonWriteNullProperties(false)
public class Test{
    ...
}
于 2015-02-19T09:18:35.903 に答える
1

JsonWriteNullProperties古いバージョンの Jackson に使用できます。

Jackson 1.9 以降の場合は、 を使用しますJsonSerialize.include

于 2012-10-04T10:31:19.540 に答える
0

Spring コンテナーを構成することで解決策を見つけましたが、まだ望んでいたものとは言えません。

Spring 3.0.5 にロールバックして削除し、その場所で構成ファイルを次のように変更しました。

    <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean
                class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper" ref="jacksonObjectMapper" />
            </bean>
        </list>
    </property>
</bean>


<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" />
<bean
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="jacksonSerializationConfig" />
    <property name="targetMethod" value="setSerializationInclusion" />
    <property name="arguments">
        <list>
            <value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value>
        </list>
    </property>
</bean>

もちろん、これは他の質問で与えられた回答と同様です。

spring mvc 3でjacksonObjectMapperが機能しない構成

注意すべき重要な点は、mvc:annotation-driven と AnnotationMethodHandlerAdapter を同じコンテキストで使用できないことです。

ただし、Spring 3.1 と mvc:annotation-driven で動作させることはまだできません。mvc:annotation-driven とそれに付随するすべての利点を使用するソリューションは、はるかに優れていると思います。誰かがこれを行う方法を教えてくれたら、それは素晴らしいことです。

于 2012-10-04T10:17:25.950 に答える