询问者
请问怎样才能正确进行JSON转化与逆转化

问题
-
我想实现的流程是:
客户端将数据JSON格式化,发送到服务端,服务端进行反序列化(用于将数据反序列化为Model,插入数据库),将数据从数据库中读出,进行序列化传输,在客户端进行反序列化,用于显示。
这样就需要既有客户端的JSON工具,还需要有.NET环境下的JSON格式数据转化工具。
但是我以下的例子总是出现问题,JSON2.JS可以转化与逆转化自己产生的数据,但是对于由服务端传送过来的数据(由服务端JSON工具转化而来)进行逆转化总是出现问题,请问怎样才能正确进行转化与逆转化?以下是客户端文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title></title>
<script language="javascript" type="text/javascript" src="json2.js"></script>
<script language="javascript" type="text/javascript">
var xmlHttp;function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}function ShowList() {
var car = new Car("奥迪", "A6", 2009, "黄色", new Date())
var carJson = JSON.stringify(car);
alert(carJson);
var deCarJson = JSON.parse(carJson);
alert(deCarJson.Make + deCarJson.Model + deCarJson.Year + deCarJson.Color + deCarJson.Date);// 可以准确转换
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", "Handler1.ashx?ts=" + new Date().getTime() + "&jsonStr=" + carJson, true);
xmlHttp.send(null);
}function handleStateChange() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
parseResults();
}
}
}function parseResults() {
var jsonStr = xmlHttp.responseText;
// jsonStr:"{"Make":"59658fea","Model":"A6","Year":2009,"Color":"9ec48272","Date":new Date(1248982452000)}"
var cars = JSON.parse(jsonStr);
var color = "";
for (var i = 0; i < cars.length; i++) {
color += " " + cars[i].color;
}
alert(color);
}function Car(make,model,year,color,date) {
this.Make = make;
this.Model = model;
this.Year = year;
this.Color = color;
this.Date = date;
}
</script>
</head>
<body>
<xml id="xmlid"></xml>
<input type="button" value="do" onclick="ShowList();" />
</body>
</html>以下是.net环境下:
using System;
using System.Web;
using Newtonsoft.Json;
using JsonExSerializer;namespace JSONAndList
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string carJson = context.Request.Params["jsonStr"];
// 可以通过,但在客户端的JSON.parse()处报:语法错误
Car car = (Car)JavaScriptConvert.DeserializeObject(carJson, typeof(Car));
string responseStr = JavaScriptConvert.SerializeObject(car);// 不能通过,报错:该字符串未被识别为有效的 DateTime。
//Serializer s = new Serializer(typeof(Car));
//Car car = (Car)s.Deserialize(carJson);
//string responseStr = s.Serialize(car);context.Response.Write(responseStr);
}public bool IsReusable
{
get
{
return false;
}
}
}public class Car
{
public Car()
{
}public Car(string make, string model, int year, string color,DateTime date)
{
this.Make = make;
this.Model = model;
this.Year = year;
this.Color = color;
this.Date = date;
}public string Make
{
get;
set;
}public string Model
{
get;
set;
}public int Year
{
get;
set;
}public string Color
{
get;
set;
}public DateTime Date
{
get;
set;
}
}
}
做最好的自己
全部回复
-
你好 你可以用Newtonsoft.Json.dll
请参考 http://www.cnblogs.com/pcode/archive/2009/03/19/1417214.html
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond -
我一般服务器端返回的xml是用xmldocument生成的 或者序列化生成的
客户端可以通过ActiveX来对xml进行操作
比如
var xmlDom=new ActiveXObject('Microsoft.XMLDOM');
xmlDom.loadXML(document.getElementById('inputPostUrl').value);
var root=xmlDom.documentElement;
var bindStatus=xmlDom.createElement('BindStatus');
var listBoxBindStatus=document.getElementById('ListBoxBindStatus');
bindStatus.text=listBoxBindStatus.options(listBoxBindStatus.selectedIndex).value;
然后通过XmlHttp发送到服务器端 服务器端对xml进行解析 返回相应结果
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond- 已建议为答案 Andrew_ZhuModerator 2009年8月6日 8:17
-
怎样才能正确进行JSON转化与反序列化的问题,最近也弄得我焦头烂额。
就是日期类型Date的问题,我自己现在还没找到一个好的解决方案。求各位高手。
我现在用的是Json2.js在客户端序列化。然后用jQuery的ajax到服务端、添加一条数据成功后,用Newtonsoft.Json.dll反序列化实体对象返回到客户端组装成Table。
一. 之前在客户端(js对象中包含'2010-01-12')这样日期类型的数据,我用JSON.stringify()序列化js对象之后,在服务端用JsonConvert.DeserializeObject反序列到实体对象时遇到Datetime对象转化失败。因为实体对象的对应字段是Datetime类型的。
e.g 关于这个问题我在网上参考了一些办法:(1)http://xiarilian12.javaeye.com/blog/532339
(2) http://www.cnblogs.com/KangC/archive/2008/12/09/1349468.html
1、我怎么弄都没弄成功,后面我单独把Date的两个字段单独出来序列化然后传参数到服务端反序列化。(意思是没将对象序列化到一个整体的json对象传到服务端处理的,而是分成多个参数分别反序列化再组成实体对象作插入操作,目的还是为了避免那个Datetime 类型的)
2、日期我弄成"\/Date(1262275200000+0800)\/" (UTC格式的) ,参考http://wyf.javaeye.com/blog/398630转化成正确的Datetime类型。
二、依照上面的第一,我是勉强可以将一条json数据插入数据库了。
现在的问题依然是那个日期的,我纠结呐、插入一条数据成功之后,根据这条数据ID取出这条数据的实体对象。用Newtonsoft.Json反序列化到客户端、用firebug调试。ajax请求已经可以将json数据传到客户端、可是我用JSON.parse()或者用eval('('+数据+')')转化成js对象报错。估计还是时间类型那个地方的错误。这个时候我json数据里面的日期类型AddDate":"\/Date(1263474214453+0800)\/" 这样的、
不知道我描述得清楚吗,我的主要问题就是用Json2.js + jQuery1.3.2 + Newtonsoft.Json.dll 这几个东东处理json日期类型的问题。
.NET3.0、3.5 里面自带的的序列化和反序列化的类我没用,一直用的Newtonsoft.Json.dll,它和Json2.js 在一个官网里面,我认为应该比较统一吧。
不知道是我的方式不对还是什么问题?我不想继续纠结在这里。真的是个杯具啦!
如果你或者哪位高手弄清楚了、希望你能教教我、我的MSN:silver_light@live.cn