「json压缩java」json压缩率

博主:adminadmin 2022-12-01 11:46:11 673

本篇文章给大家谈谈json压缩java,以及json压缩率对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

有没有将json直接转换生成Java类的工具软件

使用Jackson可以将json转为Java对象,同样也可以将java对象转为json字符串,并且Spring框架内部也是使用的此jar。

实例:将json转为java对象

/*

    下面的id,name,age同是User实体类的属性

*/

// 将json转为Java对象

String json = "{\"id\":1,\"name\":\"张三\",\"age\":18}";

ObjectMapper mapper = new ObjectMapper();

User user = mapper.readValue(json, User.class);、

// 将json转为Java数组对象

String json = "[{\"id\":1,\"name\":\"张三\",\"age\":18},{\"id\":2,\"name\":\"李四\",\"age\":18},{\"id\":3,\"name\":\"王五\",\"age\":18}]";

ObjectMapper mapper = new ObjectMapper();

User[] users = mapper.readValue(json, User[].class);

可以对response返回的json进行压缩吗

可以,每个语言有对应的处理办法,主要是gzip压缩方式,如果您是通过对方的Nginx之类的,会自带压缩,只要开启即可,代码返回压缩要自己处理,在IO流输出的时候开启gzip压缩。

但是压缩有一个问题,就是对方需要解压缩,要不然容易乱码。

在线对JSON压缩转义的工具给您推荐一个。

JSON压缩转义:

如何压缩json数据结构的大小

1,开启gzip,压缩率很高,即便是很长的文本,在网络中传输量也很小

2,不建议分次请求,除非是业务需要。连接次数过多,加大了并发的压力。

3,提醒用户点击的做法可以通过按钮反馈或loading条来做

4,如果有可能,考虑提前预读

你可以这样,在一个隐藏的 iframe 里面请求服务器,返回值是这样的:

script

parent.notifyDataArrive(YOURS_JSON_DATA);

/script

JSON数组转成JAVA

org.json.JSONObject

用这个就可以实现,你上网上找这个包就可以了,里面封装了一些方法,可以将一个JSON字符串转换为一个JSONObject对象,也可以反向操作,具体的你看下它的API就知道了。

不如你的这个字符串就可以这么实现

public static void main(String[] args) throws JSONException {

String sJson = "[{'gwcxxid':'1','spsl':'2'},{'gwcxxid':'1','spsl':'2'},{'gwcxxid':'3','spsl':'4'}]";

JSONArray jsonArray = new JSONArray(sJson);

int iSize = jsonArray.length();

System.out.println("Size:" + iSize);

for (int i = 0; i iSize; i++) {

JSONObject jsonObj = jsonArray.getJSONObject(i);

System.out.println("[" + i + "]gwcxxid=" + jsonObj.get("gwcxxid"));

System.out.println("[" + i + "]spsl=" + jsonObj.get("spsl"));

System.out.println();

}

}

json格式的字符串转换为java对象

先来解释反斜杠干嘛用的:

你既然提到了是json字符串,对,请注意字符串三个字。什么是字符串?两个引号之间的就是一个字符串比如:"abcdefg"这就是字符串.

假如我有个json对象:

{

     "message" :   "success"

}

那么问题来了,怎么把它放到一个String字符串对象里呢?

那么我们都会这么做:

String json = "{"message":"success"}";

对吧?但是这么做对吗?前面说过了,字符串是引号开始,引号结尾的,再看一眼这么做对吗?

所以我们需要转义字符去将引号放入字符串当中,而不是字符串定义的功能。“  \" ”就是表示将双引号放入字符串中。

2. json字符串转java对象

下面以ali的fastjson为例,讲解json字符串转json对象:

String jsonStr = "{\"message\" : \"success\"}";

JSONObject jsonObject = JSON.parseObject(jsonStr);

String message = jsonObject.getString("message");

System.out.println(message);

假如你有想要转换成的bean :

public class Info {

    private String message;

    public String getMessage() {

        return message;

    }

    public void setMessage(String message) {

        this.message = message;

    }

}

就可以这样:

String jsonStr = "{\"message\" : \"success\"}";

Info info = JSON.parseObject(jsonStr, Info.class);

System.out.println(info.getMessage());

这里的fastjson只是处理json的框架中的一个,此外还有jackson、Gson等等,可以根据自己的需求选择一个就可以了。

如何在java REST API中用GZip和Jersey压缩相应

有许多情景当你的REST api提供的相应是非常长的,并且我们都知道传递速度和贷款在移动设备/网络上是多重要。当开发支持REST apis的移动app的时候,我认为首要的性能最优化的点就是需要解决。猜猜是什么?因为响应式文本,因此我们能压缩这些文本。而且随着当前的只能手机和平板的能力,在客户端解压文本应该不是个大问题...因此在这篇文章中,如果你使用java的Jersey构建它,我将介绍你怎么能有选择性的压缩REST API响应,这个Jersey事JAX-RS的映射实现(还有更多)...

1.Jersey过滤器和拦截器

啊,感谢Jersey的强大的过滤器和拦截器特性,这个实现是相当容易的。然后过滤器是主要打算来维护像HTTP headers,URIs和/或HTTP methods的request和response的参数,拦截器是维护实体,通过维护实体的输入/输出流。

但是对于压缩将使用一个GZip WriterInterceptor,一个写拦截器被用于这种情况,在那个类里,实体被写到"wire",当在这种情况中时,它在服务器这边,这就意味着输出一个响应实体。

1.1GZip Writer Interceptor

那让我们来看看我们的GZip Writer Interceptor吧:

GZip Writer Interceptor

package org.codingpedia.demo.rest.interceptors;

import java.io.IOException;

import java.io.OutputStream;

import java.util.zip.GZIPOutputStream;

import javax.ws.rs.WebApplicationException;

import javax.ws.rs.core.MultivaluedMap;

import javax.ws.rs.ext.WriterInterceptor;

import javax.ws.rs.ext.WriterInterceptorContext;

@Provider

@Compress

public class GZIPWriterInterceptor implements WriterInterceptor {

@Override

public void aroundWriteTo(WriterInterceptorContext context)

throws IOException, WebApplicationException {

MultivaluedMapString,Object headers = context.getHeaders();

headers.add("Content-Encoding", "gzip");

final OutputStream outputStream = context.getOutputStream();

context.setOutputStream(new GZIPOutputStream(outputStream));

context.proceed();

}

}

注意:

它实现了WriterInterceptor,这是一个写拦截器的消息体的接口,这个接口包装调用javax.ws.rs.ext.MessageBodyWriter.writeTo

供应商实现WriterInterceptor协议必须要么以编程方式注册进一个JAX-RS运行环境,要么必须用@Provider注解来注解在一个提供商扫描语句期间自动的被JAX-RS运行环境发现。

@Compress是绑定注解的名称,在接下来的段落中我们将更详细的讨论它

“拦截器从WriterInterceptorContext中获得一个输出流并且设置一个新的用原始的GZIP包装器包装的输出流。在所有的拦截器被执行以后,输出流最终设置WriterInterceptorContext将用于序列化实体。在上面的例子中,实体字节将被写到GZIPOutputStream中,这个类将压缩流数据,然后把他们写到原始输出流。原始流总是把数据写到wire中。当拦截器被用在服务器上时,原始输出流会把数据写到底层服务器容器的流中,然后发送响应给客户端。”

“重载方法aroundWriteTo()获取WriterInterceptorContextz作为参数。这个上下文包括请求头参数getters和setters,请求属性,实体,实体流和其它属性;当你压缩你的响应时,你应当设置'Content-Encoding'头位gzip”

1.2 压缩注解

过滤器和拦截器能被绑定名字。名称绑定是一种概念,这种概念就是允许告诉一个JAX-RS的运行时,一个只为特定资源方法的特定的过滤器或者拦截器将被执行。当一个过滤器或者拦截器只对一些特定的资源方法限制,那我们就认为它是名称绑定。过滤器和拦截器没有这样的限制就被称作global。在我们的例子中我们已经构建了@Compress注解:

Compress annotation

package org.codingpedia.demo.rest.interceptors;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import javax.ws.rs.NameBinding;

//@Compress annotation is the name binding annotation

@NameBinding

@Retention(RetentionPolicy.RUNTIME)

public @interface Compress {}

而且用它来标记在资源上的方法,这个方法应该是被压缩的(eg:当GET-ing的时候,所有的博客用PodcastsResource)

@Compress annotation在资源方法上的使用

@Component

@Path("/podcasts")

public class PodcastsResource {

@Autowired

private PodcastService podcastService;

...........................

/*

* *********************************** READ ***********************************

*/

/**

* Returns all resources (podcasts) from the database

*

* @return

* @throws IOException

* @throws JsonMappingException

* @throws JsonGenerationException

* @throws AppException

*/

@GET

@Compress

@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

public ListPodcast getPodcasts(

@QueryParam("orderByInsertionDate") String orderByInsertionDate,

@QueryParam("numberDaysToLookBack") Integer numberDaysToLookBack)

throws IOException,AppException {

ListPodcast podcasts = podcastService.getPodcasts(

orderByInsertionDate, numberDaysToLookBack);

return podcasts;

}

...........................

}

2.测试

2.1SOAPui

好了,如果你正在用SOAPui测试,你能使用下面的请求违反PodcastsResource

Reqest:

请求例子:

GET HTTP/1.1

Accept-Encoding: gzip,deflate

Accept: application/json, application/xml

Host: localhost:8888

Connection: Keep-Alive

User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

Response:

被压缩的json响应,通过SOAPui自动的解压缩

HTTP/1.1 200 OK

Content-Type: application/json

Content-Encoding: gzip

Content-Length: 409

Server: Jetty(9.0.7.v20131107)

[

{

"id": 2,

"title": "Quarks Co - zum Mitnehmen",

"linkOnPodcastpedia": "",

"feed": "",

"description": "Quarks Co: Das Wissenschaftsmagazin",

"insertionDate": "2014-10-29T10:46:13.00+0100"

},

{

"id": 1,

"title": "- The Naked Scientists Podcast - Stripping Down Science",

"linkOnPodcastpedia": "",

"feed": "feed_placeholder",

"description": "The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.",

"insertionDate": "2014-10-29T10:46:02.00+0100"

}

]

SOAPui接受Content-type:gzip头,我们在GZIPWriterIntercepter中添加了并且自动的解压了响应并且用人眼可读的方式展示出来。

好了,就这些了。你已经了解了Jersey如何让它直接压缩REST api响应了。

json压缩java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于json压缩率、json压缩java的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-01,除非注明,否则均为首码项目网原创文章,转载请注明出处。