16

Javaで使用する場合

@Produces("application/json")

注釈出力は人間が読める形式にフォーマットされていません。どうすればそれを達成できますか?

4

7 に答える 7

24

念のため、一部のリソースに対してのみきれいな出力を有効にする場合は、リソースメソッドで@JacksonFeaturesアノテーションを使用できます。

次に例を示します。

@Produces(MediaType.APPLICATION_JSON)
@JacksonFeatures(serializationEnable =  { SerializationFeature.INDENT_OUTPUT })
public Bean resource() {
    return new Bean();
}
于 2014-08-21T08:35:49.160 に答える
17

これは、クエリ文字列内の「pretty」の存在に基づいて、条件付きのpretty /non-prettyjson出力を適切に実行する方法です。

PrettyFilterを実装するを作成します。これは、すべてのリクエストContainerResponseFilterで実行されます。

@Provider
public class PrettyFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException {

        UriInfo uriInfo = reqCtx.getUriInfo();
        //log.info("prettyFilter: "+uriInfo.getPath());

        MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
        if(queryParameters.containsKey("pretty")) {
            ObjectWriterInjector.set(new IndentingModifier(true));
        }

    }

    public static class IndentingModifier extends ObjectWriterModifier {

        private final boolean indent;

        public IndentingModifier(boolean indent) {
            this.indent = indent;
        }


        @Override
        public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
            if(indent) jsonGenerator.useDefaultPrettyPrinter();
            return objectWriter;
        }
    }
}

そして、ほとんどそれだけです!

自動パッケージスキャンまたは手動登録のいずれかによって、このクラスがジャージーによって使用されることを確認する必要があります。

それを達成するために数時間を費やしましたが、すぐに使用できるソリューションをこれまでに公開した人は誰もいないことがわかりました。

于 2015-09-18T10:16:59.923 に答える
16

プロジェクトの任意の場所にこのクラスを作成します。展開時にロードされます。.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);出力をフォーマットするようにマッパーを構成することに注意してください。

.configure()Jackson 2.0以降の場合、2行を次のよう に置き換えます。.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false) .configure(SerializationFeature.INDENT_OUTPUT, true);

それに応じてインポートを変更します。

package com.secret;

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

/**
 *
 * @author secret
 */
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
    private ObjectMapper objectMapper;

    public JacksonContextResolver() throws Exception {
        this.objectMapper = new ObjectMapper();
    this.objectMapper
        .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }
}

フォーマットはパフォーマンスに悪影響を与えることに注意してください。

于 2012-05-10T13:08:27.603 に答える
3

Springを使用している場合は、プロパティをグローバルに設定できます

spring.jackson.serialization.INDENT_OUTPUT=true

詳細については、https: //docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.htmlをご覧ください。

于 2017-02-28T23:10:48.963 に答える
2

役立つDaTroopの回答に基づいて、「きれいな」パラメーターの有無に基づいて、最適化されたjsonとフォーマットされたjsonのどちらかを選択できる別のバージョンを次に示します。

package test;


import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {

    private ObjectMapper prettyPrintObjectMapper;
    private UriInfo uriInfoContext;

    public JacksonContextResolver(@Context UriInfo uriInfoContext) throws Exception {
        this.uriInfoContext = uriInfoContext;

        this.prettyPrintObjectMapper = new ObjectMapper();
        this.prettyPrintObjectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> objectType) {

        try {
            MultivaluedMap<String, String> queryParameters = uriInfoContext.getQueryParameters();
            if(queryParameters.containsKey("pretty")) {
                return prettyPrintObjectMapper;
            }

        } catch(Exception e) {
            // protect from invalid access to uriInfoContext.getQueryParameters()
        }

        return null; // use default mapper
    }
}
于 2015-04-23T14:11:26.320 に答える
1

Yasson(JSR-367の公式RI)とJAVAC-JSONを使用する依存関係を使用している場合はjersey-media-json-binding、次のようにきれいな印刷を導入できます。

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class RandomConfig implements ContextResolver<Jsonb> {
    private final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withFormatting(true));

    public RandomConfig() { }

    @Override
    public Jsonb getContext(Class<?> objectType) {
        return jsonb;
    }
}
于 2019-08-30T08:26:57.720 に答える
0

ジャージー1.xの代替:

org.codehaus.jackson.map.ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
于 2021-06-25T23:35:38.977 に答える