http://www.cnblogs.com/fmxyw/archive/2009/05/06/1450886.html
在这个贴子里有解析json字符串。不过用到JavaScriptSerializer报已经过时可以用DataContractJsonSerializer替代。求替代的详细方案,最好附上代码。谢谢
在这个贴子里有解析json字符串。不过用到JavaScriptSerializer报已经过时可以用DataContractJsonSerializer替代。求替代的详细方案,最好附上代码。谢谢
你需要引用 System.ServiceModel.Web.dll
和 System.RunTime.Serialization.dll这个类在System.Runtime.Serialization.Json 命名空间下
添加System.Runtime.Serialization.dll、System.ServiceModel.Web.dll的引用
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;using System.Web.Script.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
namespace WindowsFormsApplication1
{
public class GeneralSearchResult
{
public Header header = new Header(); private DataTable fieldDefine = new DataTable(); /// <summary> /// 返回的数据结构定义,无数据 /// </summary> public DataTable FieldDefine { get { return fieldDefine; } set { fieldDefine = value; } } private DataTable retrunData = new DataTable(); /// <summary> /// 返回的数据,格式为DataTable,结构和FieldDefine中的结构一样 /// </summary> public DataTable RetrunData { get { return retrunData; } set { retrunData = value; } } /// <summary> /// 将json数据转换为定义好的对象,数据转换为DataTable /// </summary> /// <param name="jsonText"></param> /// <returns></returns> public static GeneralSearchResult GetTransformData(string jsonText) { GeneralSearchResult gsr = new GeneralSearchResult(); DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(Test)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText.Trim())); Test JsonData = (Test)s.ReadObject(ms);
gsr.header.Version = JsonData.dataSet.header.version; gsr.header.ErrorInfo = JsonData.dataSet.header.errorInfo; gsr.header.ReturnCode = JsonData.dataSet.header.returnCode; gsr.header.ReturnRows = Convert.ToInt16(JsonData.dataSet.header.returnRows); gsr.header.TotalRows = Convert.ToInt16(JsonData.dataSet.header.totalRows);
//注意:以下列的添加不知道能不能搞成动态的,不知道把类中对象名称循环添加进去可行不,请高手指教 gsr.FieldDefine.Columns.Add("assetId");
gsr.FieldDefine.Columns.Add("serverIdcId");
gsr.FieldDefine.Columns.Add("InputTime"); gsr.RetrunData = gsr.FieldDefine.Clone();
//注意:以下行的添加不知道能不能搞成动态的,不知道把类中对象循环添加进去可行不,请高手指教 foreach (row a in JsonData.dataSet.data.row)
{
DataRow dr = gsr.RetrunData.NewRow();
dr[0] = a.AssetId;
dr[1] = a.ServerIdcId;
dr[2] = a.InputTime;
gsr.RetrunData.Rows.Add(dr);
} return gsr; } /// <summary> /// 数据文件头定义 /// </summary> public class Header { private string version; /// <summary> /// 版本 /// </summary> public string Version { get { return version; } set { version = value; } } private string returnCode; /// <summary> /// 结果码,0为正常,否则为有错误 /// </summary> public string ReturnCode { get { return returnCode; } set { returnCode = value; } } private string errorInfo; /// <summary> /// 如果ReturnCode为非0时的错误信息 /// </summary> public string ErrorInfo { get { return errorInfo; } set { errorInfo = value; } } private int totalRows; /// <summary> /// 查询结果总行数 /// </summary> public int TotalRows { get { return totalRows; } set { totalRows = value; } } private int returnRows; /// <summary> /// 返回的数据行数 /// </summary> public int ReturnRows { get { return returnRows; } set { returnRows = value; } } } }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;namespace WindowsFormsApplication1
{
[DataContract(Namespace = "WindowsFormsApplication1")]
class Test
{
[DataMember(Order = 0)]
public dataSet dataSet { get; set; }
} [DataContract(Namespace = "WindowsFormsApplication1")] class dataSet
{
[DataMember(Order = 0)]
public header header { get; set; }
[DataMember(Order = 1)]
public fieldDefine fieldDefine { get; set; }
[DataMember(Order = 2)]
// public List<row> row { get; set; }
public data data { get; set; }
}
[DataContract(Namespace = "WindowsFormsApplication1")]
class header
{
[DataMember(Order = 0)]
public string returnCode{get;set;}
[DataMember(Order = 1)]
public string errorInfo{get;set;}
[DataMember(Order = 2)]
public string version{get;set;}
[DataMember(Order = 3)]
public string totalRows{get;set;}
[DataMember(Order = 4)]
public string returnRows{get;set;} }
[DataContract(Namespace = "WindowsFormsApplication1")]
class fieldDefine
{
[DataMember(Order = 0)]
public string assetId{get;set;}
[DataMember(Order = 1)]
public string serverIdcId{get;set;}
[DataMember(Order = 2)]
public string inputTime{get;set;} } [DataContract(Namespace = "WindowsFormsApplication1")]
class data
{
[DataMember(Order = 0)]
public List<row> row{get;set;}
} [DataContract(Namespace = "WindowsFormsApplication1")]
class row
{
[DataMember(Order = 0)]
public string AssetId { get; set; }
[DataMember(Order = 1)]
public string ServerIdcId { get; set; }
[DataMember(Order = 2)]
public string InputTime { get; set; } }
}
//空接口
public interface IJson
{
}public static class JsonHelper
{
public static string ToJson(this IJson source)
{
return ToJson(source, source.GetType());
} public static string ToJson(this IJson source, Type type)
{
DataContractJsonSerializer serilializer = new DataContractJsonSerializer(type);
using (Stream stream = new MemoryStream())
{
serilializer.WriteObject(stream, source);
stream.Flush();
stream.Position = 0;
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
} public static T ParseJSON<T>(this string str)
{
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(str)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(ms);
}
} // 通过JSON序列化深度克隆类型
public static T DeepClone<T>(this IJson Source) where T : IJson
{
string jsonString = Source.ToJson();
return jsonString.ParseJSON<T>();
}
}
"header":{
"returnCode":"0",
"errorInfo":"HTTP请求错误",
"version":"V1.0R010",
"totalRows":"2000",
"returnRows":"20"
},
"fieldDefine":{
"assetId":"string",
"serverIdcId":"int",
"inputTime":"datetime"
},
"data":{"row":[
{
"AssetId":"TCNS2006888",
"ServerIdcId":"1",
"InputTime":"2008-12-12"
},
{
"AssetId":"TCNS2006889",
"ServerIdcId":"2",
"InputTime":"2008-1-1"
}
]}
}
}
class Test
{
[DataMember(Order = 0)]
public dataSet dataSet { get; set; }
}
[DataContract(Namespace = "WindowsFormsApplication1")] 这句话是什么意思啊 有什么用啊 可以不用吗