您当前的位置:首页 > 互联网教程

Java中如何把字符串转换成map

发布时间:2025-05-22 16:52:43    发布人:远客网络

Java中如何把字符串转换成map

一、Java中如何把字符串转换成map

首先,你先确认你的字符串是否是json格式的,如果是json格式,那你可以使用Gson.jar或json-lib-xx-jdk.jar两个包来自动解析解析。

使用Gson更简单些,只需要导入一个包就可以,但是他如果使用Object解析到int型的话或自动转成double型,需要定义一个准确的类来解析,不能直接使用Object。示例:

Map<String,Object>map=newHashMap<String,Object>();

map=gson.fromJson(str,map.getClass());

使用json-lib包的话需要导入更多的包,需要额外导入commons-lang.jar、ezmorph-1.0.4.jar、commons-logging-1.1.1.jar、commons-collections.jar、commons-beanutils.jar这5个包。解析示例如下:

使用json-lib包的话需要导入更多的包,需要额外导入commons-lang.jar、ezmorph-1.0.4.jar、commons-logging-1.1.1.jar、commons-collections.jar、commons-beanutils.jar这5个包。解析示例如下:

JSONObjectjb=JSONObject.fromObject(str);

Map<String,Object>map=(Map<String,Object>)jb;

如果你的字符串不是json格式,那你就需要自己使用split分割字符串,例如:

如果你的字符串不是json格式,那你就需要自己使用split分割字符串,例如:

Stringstr="color:red|font:yahei|width:800|height:300";

String[]strs=str.split("\\|");

Map<String,String>m=newHashMap<String,String>();

二、Java代码优化实战-请求合并

在进行系统设计的时候,不知道大家是否也遇到过这个问题,大量请求造成数据库压力过大。本文将介绍在高并环境下,上面这个问题的一种简单应对思路。

首先思考一个场景,在高并发的系统中,在每秒内有大量的请求要访问数据库,如果不考虑缓存,怎么才能够处理降低数据库压力。有的同学可能会说这多简单啊,增加带宽,加内存提升服务器性能。

如果不用这些方法呢?那么就可以用到请求合并的方法,将一段时间内的请求进行合并,然后统一提交查询数据库,能够做到将几十个甚至上百个查询进行批量处理。

当然,这么做也有一个前提,就是这些请求对实时性的要求不能太高。在这个条件下,牺牲一定的处理时间,来减少网络连接数,这么处理是一种性价比非常高的方法。

首先我们模拟一个场景,在不进行合并请求的情况下进行1000次请求,使用Postman进行请求测试,并使用Druid连接池进行数据库的监控:

可以看出,实际进行了1000次数据库的访问。在超高流量的情况下,这种访问方式是十分危险的,所以减少数据库的访问就成了当务之急。

再看看之前提到的请求合并,实现起来有这么几个问题需要解决:

1、以什么粒度作为合并请求的规则:

这里推荐按照时间粒度去合并请求,不推荐按照请求数量达到一定值再进行合并是因为有可能一段时间内请求数量比较少,达不到阈值则无法执行,造成早到达的请求等待非常长的时间。

Java中的ScheduledExecutorService提供了定时调度机制,且本身实现了ExecutorService接口,所以本身也支持线程池的所有功能。

存放请求的方式就比较多了,我们知道,在高并发系统的设计中,消息队列被普遍应用于解耦,使用消息队列存放请求是非常合适的做法。由于我们这里是单机环境,能够保证线程安全的阻塞队列LinkedBlockingQueue就能简单实现我们的需求。

自从JAVA1.5以后引入了Future接口,用于处理异步调用和并发事务。Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。简单的说,我们可以用它来接收线程的执行结果。

好了,请求的合并、执行、返回三大步骤都梳理清楚了,让我们看看具体怎么实现。

使用1000个线程对请求合并方法进行测试:

原本1000次的数据库操作被我们减少到了7次,实际对数据库的访问降到了之前的0.7%。当然,实际业务环境中可能定时调度的时间间隔不会增加到200ms这么大,这里只是为了演示一下请求合并能够发挥的巨大潜能。

优点显而易见,通过请求合并减少了数据库的网络连接,降低数据库压力。最大化的利用的系统的IO,来提升系统的吞吐性能。

当然它也存在一定的局限性,仅能够用于对请求实时性要求不高的高并发系统,如果系统的应用场景不是在高并发场景下,那么根本没有使用请求合并的必要。

如果觉得对您有所帮助,小伙伴们可以点赞、转发一下,非常感谢

公众号码农参上,加个好友,做个点赞之交啊

三、java将 json数组转map

1、首先,你的[{"key":"1"},{"key":"2"}]是一个JSON数组格式。如果你有简单的JSON格式,例如{"key1":"1","key2":"2"},你可以使用下面的示例进行转换:

2、public static void main(String[] args){

3、String jsonString="{\"key1\":\"1\",\"key2\":\"2\"}";

4、for(Map.Entry entry: map.entrySet()){

5、Object value= entry.getValue();

6、System.out.println(key+":"+ value);

7、@SuppressWarnings("unchecked")

8、public static Map toMap(String json){

9、JSONObject jsonObject= JSONObject.fromObject(json, new JsonConfig());

10、Iterator keys= jsonObject.keys();

11、Object value= jsonObject.get(key);

12、执行结果是你这种数组格式,转换成Map那么同名的key会覆盖的。这意味着,如果数组中有多个对象具有相同的键,那么最后一个对象的值将会被保留。

13、为了处理JSON数组,你需要先将数组中的每个对象转换成Map,然后再合并。假设你有一个JSON数组,如[{"key":"1"},{"key":"2"}],可以先遍历数组,将每个对象转换成Map,再将所有的Map合并到一个Map中。

14、public static void main(String[] args){

15、String jsonString="[{\"key\":\"1\"},{\"key\":\"2\"}]";

16、for(Map.Entry entry: map.entrySet()){

17、System.out.println(entry.getKey()+":"+ entry.getValue());

18、@SuppressWarnings("unchecked")

19、public static Map toMap(String json){

20、JSONArray jsonArray= JSONArray.fromObject(json);

21、for(int i= 0; i< jsonArray.size(); i++){

22、JSONObject jsonObject= jsonArray.getJSONObject(i);

23、map.put(jsonObject.getString("key"), jsonObject.getString("value"));

24、在上述示例中,我们使用了JSONArray来处理JSON数组,并遍历数组中的每个对象,将每个对象的键值对放入Map中。这种方法可以确保数组中的所有键值对都被正确地转换为Map格式。

25、需要注意的是,实际开发中,你需要根据实际情况调整代码中的类型和方法,以确保代码能够正确地处理不同的JSON数据格式。