Jersey、Jackson和;使用Curl命令的json.org/java解析器

Jersey、Jackson和;使用Curl命令的json.org/java解析器,java,json,curl,jersey,jackson,Java,Json,Curl,Jersey,Jackson,使用Java6、Tomcat7、Jersey 1.15、Jackson 2.0.6(来自FasterXMLMavenRepo)和www.json.org解析器,我试图 漂亮地打印JSON字符串,使其看起来由curl-xget命令行缩进 我创建了一个简单的web服务,它具有以下体系结构: 我的POJO(模型类): Family.java import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Fa

使用Java6、Tomcat7、Jersey 1.15、Jackson 2.0.6(来自FasterXMLMavenRepo)和www.json.org解析器,我试图 漂亮地打印JSON字符串,使其看起来由curl-xget命令行缩进

我创建了一个简单的web服务,它具有以下体系结构:

我的POJO(模型类):

Family.java

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Family {
    private String father;
    private String mother;

    private List<Children> children;

    // Getter & Setters
}
使用实用程序类,我决定硬编码POJO,如下所示:

public class FamilyUtil {

    public static Family getFamily() {
        Family family = new Family();
        family.setFather("Joe");
        family.setMother("Jennifer");

        Children child = new Children();
        child.setName("Jimmy");
        child.setAge("12");
        child.setGender("male");
        List<Children> children = new ArrayList<Children>();

        children.add(child);

        family.setChildren(children);
        return family;
    }
}
当我使用以下命令运行此命令时:

curl -X GET http://localhost:8080/mywebservice
我在Eclipse的控制台中得到了以下信息:

{"father":"Joe","mother":"Jennifer","children":[{"name":"Jimmy","age":"12","gender":"male"}]}
但是从命令行上的curl命令(这个响应更重要):

这是添加换行符转义序列并放置双引号(但不是缩进,因为它应该在新行后有4个空格,但全部在一行中)


如果有人能给我指出正确的方向,我将不胜感激。

我相信当前配置的消息体读取器正在获取从方法返回的字符串,并对其进行正确转义,使其成为有效的JSON字符串(因为JSON不允许换行符进入字符串常量)

这就是你要做的。。。我假设你使用的是杰克逊的邮件正文作者。(例如JacksonJsonProvider)

您创建了一个@Provider,该@Provider设置了一个ObjectMapper实例,并启用了漂亮的打印功能,如下所示:

@Provider
public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper> {

    /**
     * {@inheritDoc}
     */
    @Override
    public ObjectMapper getContext(final Class<?> type) {
        final ObjectMapper toReturn = new ObjectMapper();
        toReturn.enable(SerializationFeature.INDENT_OUTPUT); // This is the important setting
        toReturn.disable(MapperFeature.USE_ANNOTATIONS); // I have this one on but it's probably for other resources in the container testing it in, I don't know if you'd need it.
        return toReturn;
    }
}

$ curl http://<server>/<ctx-root>/<path>
{
  "father" : "Joe",
  "mother" : "Jennifer",
  "children" : [ {
    "name" : "Jimmy",
    "age" : "12",
    "gender" : "male"
  } ]
}
$curlhttp:////
{
“父亲”:“乔”,
“母亲”:“詹妮弗”,
“儿童”:[{
“姓名”:“吉米”,
“年龄”:“12岁”,
“性别”:“男性”
} ]
}
现在,我不想让提供者和MessageBodyReader注册到您的JAX-RS应用程序配置中,但这可能会因您使用Jersey的servlet、使用自定义应用程序、使用Guice或任何其他设置JAX-RS堆栈的方法而大不相同。

只需使用

这是泽西岛的一个例子 正常Gson:

Gson gson = new Gson();
    String json = gson.toJson(obj);
    System.out.println(json);
JSON输出显示为压缩模式,如下所示:

{"data1":100,"data2":"hello","list":["String 1","String 2","String 3"]}
要启用漂亮打印,应使用GsonBuilder返回Gson对象:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String json = gson.toJson(obj);
    System.out.println(json);
输出将如下所示:

{
  "data1": 100,
  "data2": "hello",
  "list": [
    "String 1",
    "String 2",
    "String 3"
  ]
}
来自


等待Jersey应用程序(web.xml)是否配置为使用Jackson附带的MessageBodyWriter?谢谢Charlie,这个新类JacksonObjectMapProvider将在哪里调用?我是否只是把它包含在任何包中,它会给我解决方案?非常感谢你!我明天会试试,然后公布结果@socal_javaguy-可能,这取决于您如何设置资源所在的容器。Jersey确实有一个包扫描选项(您需要包括包含ObjectMap提供程序的包,以及包含jackson附带的MessageBodyWriter的com.fasterxml.jackson.jaxrs.json)。如果您的ObjectMap提供程序位于JaxRS应用程序中,那么可以解决的问题是,在您的war中,在某些容器(例如Websphere)上,包扫描程序不一定能够跨JAR正常工作。。。您可以使用Guice并显式绑定提供者、MessageBodyReaders/Writer和提供者。。。您还可以创建一个显式模型,并在其中定义类/单例对象。
Gson gson = new Gson();
    String json = gson.toJson(obj);
    System.out.println(json);
{"data1":100,"data2":"hello","list":["String 1","String 2","String 3"]}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String json = gson.toJson(obj);
    System.out.println(json);
{
  "data1": 100,
  "data2": "hello",
  "list": [
    "String 1",
    "String 2",
    "String 3"
  ]
}
package com.mkyong.core;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonExample {
    public static void main(String[] args) {

    DataObject obj = new DataObject();
    // Gson gson = new Gson();

    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    String json = gson.toJson(obj);

    System.out.println(json);

    }
}