1

別の問題を解決するために、Jersey から EclipseLink MOXy に移行して、JAXB で作成されたオブジェクト モデル (Sun JAXB 2.1.12 で作成) から JSON を生成しました。私が気づいた1つの違いは、出力のフォーマットです

ジャージーが出力する

{"artist-list":{"offset":0,"count":1,"artist":[{"score":"100","type":"Group","id":"4302e264-1cf0-4d1f-aca7-2a6f89e34b36","name":"Farming Incident","sort-name":"Incident, Farming","gender":"male","country":"AF","disambiguation":"the real one","ipi-list":{"ipi":["1001","1002"]},"life-span":{"begin":"1999-04","ended":"true"},"tag-list":{"tag":[{"count":5,"name":"thrash"},{"count":11,"name":"güth"}]}}]}}

しかし、MOXyは

"count" : "1",
   "offset" : "0",
   "artist" : [ {
      "id" : "4302e264-1cf0-4d1f-aca7-2a6f89e34b36",
      "type" : "Group",
      "score" : "100",
      "name" : "Farming Incident",
      "sort-name" : "Incident, Farming",
      "gender" : "male",
      "country" : "AF",
      "disambiguation" : "the real one",
      "ipis" : [ "1001", "1002" ],
      "life-span" : {
         "begin" : "1999-04",
         "ended" : "true"
      },
      "tags" : [ {
         "count" : "5",
         "name" : "thrash"
      }, {
         "count" : "11",
         "name" : "güth"
      } ]
   } ]
}

Moxyの方がはるかにきれいです:)しかし、Jsonを介してデータを利用できるようにするために移動する理由の1つは、伝送帯域幅を減らすことです.MOXyに1行すべてを生成させ、それぞれの周りに余分なスペースを入れないようにすることは可能ですか?

4

1 に答える 1

0

デフォルトでは、 EclipseLink JAXB (MOXy)は JSON を 1 行にマーシャリングします。フォーマットされた出力を取得するには、 で次のプロパティを設定する必要がありますMarshaller

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

package forum11450509;

public class Root {

    private String foo;
    private int bar;

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public int getBar() {
        return bar;
    }

    public void setBar(int bar) {
        this.bar = bar;
    }

}

jaxb.properties

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

次のコードは、フォーマットされた出力を指定する方法を示しています。

package forum11450509;

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(2);
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Root.class}, properties);

        Root root = new Root();
        root.setFoo("ABC");
        root.setBar(123);

        System.out.println("One Line:");
        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(root, System.out);

        System.out.println("\nFormatted:");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

出力

以下は、デモ コードを実行した結果の出力です。

One Line
{"bar":123,"foo":"ABC"}
Formatted:
{
   "bar" : 123,
   "foo" : "ABC"
}

JAX-RS

同じ動作がMOXyJsonProvider( http://blog.bdoughan.com/2012/05/moxy-as-your-jax-rs-json-provider.htmlを参照) にも当てはまります。

一行

デフォルトMOXyJsonProviderでは、JAX-RS アプリケーションに含めると、出力は 1 行にマーシャリングされます。

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(MOXyJsonProvider.class);
        set.add(CustomerService.class);
        return set;
    }

}

フォーマットされた出力

MOXyJsonProviderフォーマットされた出力を生成するように構成することもできます。

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(1);
        set.add(ExampleService.class);
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider();
        moxyJsonProvider.setFormattedOutput(true);
    }

} 
于 2012-07-12T13:13:13.637 に答える