Jersey、Jackson和;使用Curl命令的json.org/java解析器
使用Java6、Tomcat7、Jersey 1.15、Jackson 2.0.6(来自FasterXMLMavenRepo)和www.json.org解析器,我试图 漂亮地打印JSON字符串,使其看起来由curl-xget命令行缩进 我创建了一个简单的web服务,它具有以下体系结构: 我的POJO(模型类): Family.javaJersey、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
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);
}
}