Java的Map中value为一个json数据,将map序列化多了转义及在某一方法中return多个值问题

一、首先我想在某一方法中return多个值
情景:将一个方法中多次post的结果都返回,后来我想到的是将每一次的请求的结果(Json数据类似下面的例子)放在一个Map里面,然后将这个Map再序列化,然后返回序列化结果就OK了。
然后就导致了,返回的结果是这样的:(被转义了(ps:这不是我想要的那种结果))
这里写图片描述

所以就有了下面的话题:
ps:附如何建一个Java工程,及运行(主要是用于测试的,我实际项目是javaWeb项目)

二、解决返回值被转义问题
之前有过一篇介绍C#使用字典如何拼接并反序列化的将Json数据(带数组)的数据进行拼接
这里用Java实现。
这里写图片描述
还是拼接成这样的数据,然后打打印出来
发现被转义了;找原因
最后发现这个没有将map数据toString
这里写图片描述
将其toString以后就不会被转义了
这里写图片描述
将这两个map和map.toString()打印出来发现信息是一样的(是不是很神奇)
我先将Map对象直接打印和map.toString打印结果也是一样的 没明白为什么会这样
这里写图片描述

问:
java里面直接打印对象是可以出现对象的字符串的值,但是C#却是对象地址
答:因为Java里面的HashMap重写了toString方法
见下图:

这里写图片描述

问:
那map1只有在map1.toString()之后才会拼接成key=value格式字符串才对,为啥打印map1也是出来key=value格式字符串
答:
toString这个方法是自动执行的
也就是你有没有调toString他都会自己调
问:
我自己在这个类中重写一个toString()方法,为啥map.toString没有走?
答:
map实际上是HashMap的对象,他走的是HashMap的toString,不会走你这个类重写的toString

这里写图片描述
这里写图片描述
父类Object的toString方法的对象就是返回对象地址,这就和C#一样一样了
ps:有时候解决问题就是像破案,很多理论知识还得自己多思考
拼接demo如下:

package com.cn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class JsonToStr {
    public static void main(String[] args)
    {
        JsonToStr jt=new JsonToStr();
        String result=jt.dataToJson();
    }
    public String dataToJson()
    {
        Map<String,String> ma1=new HashMap<String,String>();
        ma1.put("name", "Google");
        ma1.put("url", "http://www.google.com");
       List<Map<String,String>> ma2=new ArrayList<>();
       ma2.add(ma1);
       JSONArray maMap=JSONArray.fromObject(ma2);//.fromObject(ma2);
       String links=maMap.toString();//数组序列化
        Map<String,String> ma=new HashMap<String,String>();
        ma.put("name", "BeJson");
        ma.put("url", "http://www.bejson.com");
        ma.put("links", links);
        JSONObject maMap1=JSONObject.fromObject(ma);
        String msStr=maMap1.toString();
        Map<String,String> map1=new HashMap<String,String>();
        map1.put("jsonStr", msStr);
        map1.put("id","\"zh2789\"");
        System.out.println("map1:"+map1);
        JSONObject map1Map=JSONObject.fromObject(map1);
        String result=map1Map.toString(); 
        System.out.println("没有将map1使用toString方法返回的结果为:"+result);    

        System.out.println();
        System.out.println("map1.toString():"+map1.toString()); 
        JSONObject maPMap=JSONObject.fromObject(map1.toString());
        String result2=maPMap.toString();
        System.out.println("先将对象toString,然后再序列化:"+result2);
        return result;
    }


}

三、ps:在MyEclipse里面创建一个Java工程
1、新建一个Java工程
这里写图片描述
2、给项目去一个名字(这个过程直接点击finish也一样)
这里写图片描述
3、finish项目
这里写图片描述
4、找到我们新建的项目,然后添加Java类此时的目录
这里写图片描述
5、选中src,右键
这里写图片描述
这里写图片描述
然后就可以写方法咯。

四、ps:并导入外部jar包,因为我的这个序列化jar包依赖太多,就不推荐了,主要介绍步骤
打开本地的刚新建的工程目录,发现没有lib目录
web项目是有WebContent目录的,WebContent下面的lib下面就是jar包,但是Java工程里面没有lib
1、先将鼠标移到项目上,右键先新建一个文件夹,并取名为lib
这里写图片描述
这里写图片描述
2、此时的项目结构:
这里写图片描述
3、通过复制粘贴方式将外部的jar包粘贴到lib下面(ps在D盘下操作,
而不是直接在MyEclipse中粘贴)
这里写图片描述
4、添加完成后,选中这个项目,选择Build Path ——> Configure Build Path
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

五:ps运行Java工程,web项目是需要启动tomcat 的这个不需要
1、选中java项目单击右键->run as->java application(类中必须要有main方法)
这里写图片描述
2、运行以后发现缺少jar包,循环四jar包添加步骤
这里写图片描述

六、PS:将List数组序列化问题
我的jar包里面已经有将数组序列化的方法,所以直接用即可,不过推荐阿里的FastJson.jar比较好用

猜你喜欢

转载自blog.csdn.net/weixin_39885282/article/details/80202075