求助 关于JSON 相当纠结!

likeajin 2013-07-03 04:22:58
包用的是json-lib-2.3-jdk15.jar。请看以下代码:

class Test{
private String a;
public Test(String t){a = t;}
public String getA(){return a;}
public void setA(String t){a = t;}
}
class Main{
public static void main(String[] P){
Test t = new Test("''");
JSONObject x = JSONObject.fromObject(x); //{"a":"''"}
String s = x.toString(); //"{\"a\":\"''\"}"
x = JSONObject.fromObject(s); //{"a":""} 字符串中的单引号不见了……
}
}

注:以上代码是测试,实际运用中是后台接受一个前台传递过来的json字符串,通过json包获取信息,其中就有值为''的字符串,可怎么都获取不到。
...全文
498 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
likeajin 2013-07-10
  • 打赏
  • 举报
回复
引用 19 楼 Jolestar 的回复:
这是 json-lib-2.3 的一个bug。升级到 2.4即可解决。 http://json-lib.sourceforge.net/changes-report.html#a2.4 A string starting and ending with quotes is badly parsed. Thanks to Sascha Theves (provided patch) Fixes 2893329.
谢谢,果然
likeajin 2013-07-09
  • 打赏
  • 举报
回复
引用 17 楼 jerrygr_ok 的回复:
我的又没出现问题,我调试干啥啊 我觉得这个问题就到这儿吧,别人那里没有问题,而你的却不行,这肯定是你的程序问题,不管是jar的版本问题,还是其他的,只能你自己找一找了
呵呵~~
jerrygr_ok 2013-07-09
  • 打赏
  • 举报
回复
我的又没出现问题,我调试干啥啊 我觉得这个问题就到这儿吧,别人那里没有问题,而你的却不行,这肯定是你的程序问题,不管是jar的版本问题,还是其他的,只能你自己找一找了
likeajin 2013-07-09
  • 打赏
  • 举报
回复
引用 15 楼 jerrygr_ok 的回复:
这转义字符怎么可能变成两个呢,它自己转义了,你的servlet用的也跟别人不一样?
调试的时候右上角显示的参数是"{'a':'\\'\\''}",但参数实际是{'a':'\'\''}。 我感觉你没调试。
jerrygr_ok 2013-07-09
  • 打赏
  • 举报
回复
可能是吧,你自己换个包试试吧,不过,你这个地方后台接收到结果就不对,根据url传递个参数过去: http://...test.do?json={'a':'\'\''} 后台获取到的参数:p = "{'a':'\\'\\''}"; 这转义字符怎么可能变成两个呢,它自己转义了,你的servlet用的也跟别人不一样?
likeajin 2013-07-09
  • 打赏
  • 举报
回复
引用 13 楼 jerrygr_ok 的回复:
伙计,我是真的不知道老大你是怎么传的,我这里是没有问题的:
伙计,我也真的不知道老大你是怎么没问题的。 根据url传递个参数过去: http://...test.do?json={'a':'\'\''} 后台获取到的参数:p = "{'a':'\\'\\''}"; JSONObject job = JSONObject.fromObject(p); --> job={"a":""} PS:不知道是我的json-lib有问题还是什么原因。在字符串为"''"的这种情况下,我这里每次JSONObject.fromObject都会消耗一对单引号,怎么转义都没用……

String test = "{'a':'\\'\\'\\'\\'\\'\\'\\'\\''}";  //"{'a':'\'\'\'\'\'\'\'\''}"
JSONObject json = JSONObject.fromObject(test);     //{"a":"''''''"}
test = json.toString().replaceAll("'", "\\\\'");   //"{"a":"\'\'\'\'\'\'"}"
json = JSONObject.fromObject(test);                //{"a":"''''"}
test = json.toString().replaceAll("'", "\\\\'");   //"{"a":"\'\'\'\'"}"
json = JSONObject.fromObject(test);                //{"a":"''"}
test = json.toString().replaceAll("'", "\\\\'");   //"{"a":"\'\'"}"
json = JSONObject.fromObject(test);                //{"a":""}
jolestar 2013-07-09
  • 打赏
  • 举报
回复
这是 json-lib-2.3 的一个bug。升级到 2.4即可解决。 http://json-lib.sourceforge.net/changes-report.html#a2.4 A string starting and ending with quotes is badly parsed. Thanks to Sascha Theves (provided patch) Fixes 2893329.
jerrygr_ok 2013-07-08
  • 打赏
  • 举报
回复
伙计,我是真的不知道老大你是怎么传的,我这里是没有问题的:

var url = "/extjs4/ajax/ajaxAction!getJsonObject.action?json={id:1,name:'tom',age:20,email:'\'\'',isIt:true,gender:'a',deposit:1000}"
后台方法:

	public void getJsonObject() {
		String json = request.getParameter("json");
		JSONObject fromObject = JSONObject.fromObject(json);
		System.out.println(fromObject.toString());
		User user = (User) JSONObject.toBean(fromObject, User.class);
		System.out.println(user);
		
	}
后台打印输出:

{"id":1,"name":"tom","age":20,"email":"''","isIt":true,"gender":"a","deposit":1000}
User[id=1,name=tom,age=20,email='',isIt=true,gender=a,deposit=1000]
likeajin 2013-07-04
  • 打赏
  • 举报
回复
引用 10 楼 splendid_java 的回复:
引用 9 楼 likeajin 的回复:
我已经解决这个问题了,只是不知道是不是最佳方案。有提议或解决方案的,请对自己的发言负责,请试过确认可行后再发言。
上面的不行吗?还是不符合你的要求?
可能你没明白我的意思,前台怎么到后台这个不管,我后台已经得到数据了,和前台是一模一样的。只是在前台如果传递到后台的一个属性值是:"''"的话,后台用JSONObject或JSONArray的fromObject方法获取后得不到这个值,得到的是一个空字符串,实际上我需要的是一个值为''的字符串。转义也不能达到目标。 示例代码: var s = '{"a":"\'\'"}'; post--> s = s.replaceAll("\'", "\\\'"); 这里怎么转义都没用 JSONObject x = JSONObject.fromObject(s); 这里得到的x为{"a":""}
coooliang 2013-07-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/cl61917380/article/details/9239759
ZHOU西口 2013-07-04
  • 打赏
  • 举报
回复
引用 9 楼 likeajin 的回复:
我已经解决这个问题了,只是不知道是不是最佳方案。有提议或解决方案的,请对自己的发言负责,请试过确认可行后再发言。
上面的不行吗?还是不符合你的要求?
likeajin 2013-07-04
  • 打赏
  • 举报
回复
我已经解决这个问题了,只是不知道是不是最佳方案。有提议或解决方案的,请对自己的发言负责,请试过确认可行后再发言。
ayong95 2013-07-03
  • 打赏
  • 举报
回复
前台的字符串:{"a":"\\\'\\\'"} 楼主试试这样的
likeajin 2013-07-03
  • 打赏
  • 举报
回复
引用 6 楼 jerrygr_ok 的回复:
楼主这是要做什么?是说你的json字符串中某个属性值为空,还是说它的值就是两个引号[''或""],你要传递引号作为值,要进行转义,你传递一个这个:"''",它自然认为你的这个属性的值是空字符串,要让后台的值为:'',你要进行转义:"\'\'",这样你拿到的某个属性的值才会是两个引号
你怎么认为我说那个值是空,我没说那个值是空嘛,我也试过转义,不行就是不行……
jerrygr_ok 2013-07-03
  • 打赏
  • 举报
回复
楼主这是要做什么?是说你的json字符串中某个属性值为空,还是说它的值就是两个引号[''或""],你要传递引号作为值,要进行转义,你传递一个这个:"''",它自然认为你的这个属性的值是空字符串,要让后台的值为:'',你要进行转义:"\'\'",这样你拿到的某个属性的值才会是两个引号
ZHOU西口 2013-07-03
  • 打赏
  • 举报
回复
var data = {'name':'zangsan','age':''};这样的? 也可以。
likeajin 2013-07-03
  • 打赏
  • 举报
回复
引用 3 楼 splendid_java 的回复:
给你个demo: test.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>test.html</title>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
		<script>
			var count = 0;
			$(function(){
				var data = {'name':'zangsan','age':'25'};
				$.ajax({
					type:"post",
					url:"com/testServlet",
					data:{'jsonstr':JsonToStr(data)},
					dataType:"html",
					success:function(res){
						alert(res);
					}
				});
			})
			//json转json串
			function JsonToStr(o) {
				var arr = [];
				var fmt = function(s) {
					if (typeof s == 'object' && s != null)
						return JsonToStr(s);
					return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s;
				}
				for ( var i in o)
					arr.push("'" + i + "':" + fmt(o[i]));
				return '{' + arr.join(',') + '}';
			}
			
		</script>	
	</head>
	<body>
		
	</body>
</html>
TestServlet:

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		
		String jsonstr = request.getParameter("jsonstr");
		System.out.println(jsonstr);//输出{'name':'zangsan','age':'25'}
		
		JSONObject json = JSONObject.fromObject(jsonstr);
		out.println(json.toString());
		out.flush();
		out.close();
	}
你试着把你的demo中某个属性值改为 "''",在后台看看能不能得到。
ZHOU西口 2013-07-03
  • 打赏
  • 举报
回复
给你个demo: test.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>test.html</title>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
		<script>
			var count = 0;
			$(function(){
				var data = {'name':'zangsan','age':'25'};
				$.ajax({
					type:"post",
					url:"com/testServlet",
					data:{'jsonstr':JsonToStr(data)},
					dataType:"html",
					success:function(res){
						alert(res);
					}
				});
			})
			//json转json串
			function JsonToStr(o) {
				var arr = [];
				var fmt = function(s) {
					if (typeof s == 'object' && s != null)
						return JsonToStr(s);
					return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s;
				}
				for ( var i in o)
					arr.push("'" + i + "':" + fmt(o[i]));
				return '{' + arr.join(',') + '}';
			}
			
		</script>	
	</head>
	<body>
		
	</body>
</html>
TestServlet:

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		
		String jsonstr = request.getParameter("jsonstr");
		System.out.println(jsonstr);//输出{'name':'zangsan','age':'25'}
		
		JSONObject json = JSONObject.fromObject(jsonstr);
		out.println(json.toString());
		out.flush();
		out.close();
	}
likeajin 2013-07-03
  • 打赏
  • 举报
回复
引用 1 楼 splendid_java 的回复:
你的json字符串格式正确吗?或者说,现在传给后台一个json串,你是怎么获取并转为json的?
前台的字符串:'{"a":"\'\'"}', 后台获取到的字符串:"{\"a\":\"\'\'\"}" 后台获取JSONObject的方法:JSONObject.fromObject(p);//p就是上面获取到的。
ZHOU西口 2013-07-03
  • 打赏
  • 举报
回复
你的json字符串格式正确吗?或者说,现在传给后台一个json串,你是怎么获取并转为json的?

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧