Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使MOXy仅在一行上输出以节省空间_Java_Json_Jersey_Eclipselink_Moxy - Fatal编程技术网

Java 如何使MOXy仅在一行上输出以节省空间

Java 如何使MOXy仅在一行上输出以节省空间,java,json,jersey,eclipselink,moxy,Java,Json,Jersey,Eclipselink,Moxy,为了解决另一个问题,我从使用Jersey转到EclipseLink MOXy,从Sun JAXB 2.1.12创建的JAXB创建的对象模型生成JSON。我注意到的一个区别是输出的格式 那件球衣输出 {"artist-list":{"offset":0,"count":1,"artist":[{"score":"100","type":"Group","id":"4302e264-1cf0-4d1f-aca7-2a6f89e34b36","name":"Farming Incident","sor

为了解决另一个问题,我从使用Jersey转到EclipseLink MOXy,从Sun JAXB 2.1.12创建的JAXB创建的对象模型生成JSON。我注意到的一个区别是输出的格式

那件球衣输出

{"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"}]}}]}}
但是莫西给了

"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"
      } ]
   } ]
}
莫西要漂亮得多: 但是,通过Json提供数据的原因之一是为了减少传输带宽,这样就可以让MOXy生成所有一行数据,并且在每行数据周围没有额外的空间:?

默认情况下将Json封送到一行。要获取格式化输出,需要在封送拆收器上设置以下属性:

jaxb.properties

演示

以下代码演示如何指定格式化输出:

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);
    }

}
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);
    }

} 
JAX-RS

MOXyJsonProvider也有相同的行为,请参见:

一行

默认情况下,当您在JAX-RS应用程序中包括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<?>>(2);
        set.add(MOXyJsonProvider.class);
        set.add(CustomerService.class);
        return set;
    }

}

啊,我应该看到这一点,我在看我的initialcontext方法,而不是我的marshaller初始化,禁用了marshaller.JAXB_格式化的_输出,现在works@Blaise我有个问题。通过在JAXB.properties文件中提供javax.xml.bind.context.factory=org.eclipse.persistence.JAXB.JAXBContextFactory条目,我指定moxy作为JAXB提供者。我没有为json输出指定moxyjsonprovider。在我的例子中,将使用什么来提供json输出?如果我的理解有误,请纠正我。@user2186831-这要看情况而定。没有适用于所有环境的标准JSON绑定提供程序,因此您将获得所使用环境的默认值。例如,在GlassFish 4中,默认值为MOXy:
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"
}
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;
    }

}
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);
    }

}