关于JSon的一点想法

南楼画角 提交于 2020-02-21 04:15:21

最近几天研究了一下GoogleEarth的API ,在学习过程中不断地感叹google的伟大,他替你想到了一切你想要的并把接口毫无保留的提供给了你,让我们可以在这个平台上自由发挥,看了一点他的API 想做个demo,根据一组经纬度的集合 ,在球上打一系列点,每个点上加上相应的表示,乍一想很简单,做个定时器,定时向服务器请求最新的目标经纬度,然后调用API显示,可是实际操作起来马上就遇到了问题,用ajaxPro+google地球的API ,发现两者之间定义了很多相同的方法,会冲突,由于ajaxPro对JSon数据有着良好的的解析能力,我对其情有独钟,当然由于它的过分封装,使用起来确实有些傻瓜,而且偶尔会出现一些很难解决的问题(诸如命名空间为定义之类的,session丢失,过期后请求ashx文件退出登录页时脚本错误等)。但是这些都不能否认ajaxPro还是一个很不错的ajax框架,在我看来它比jquery的ajax要强一些,ajaxPro玩不了了,试试jquery的ajax,jquery的强大在于它的选择器,在异步请求方面个人觉得不是很好用,它主要提供了三种方式,$.get(),$post(),$.ajax();前两种都是基于$.ajax()的,我个人喜欢用$.ajax(),它的可控性更强一些,而且在出现异常时可以根据返回的erro判断异常的原因,调试更为方便。选好了方法该想想数据以什么方式传递数据了,由于后台现在有现成的方法返回List<T>,所以返回JSon格式的数据是最为理想的,这在ajaxPro中是不用自己考虑的,它自己完成了序列化和反序列化,但是用Jquery这部分工作就得自己完成 。开始自己写了两个方法用来将复杂对象序列化为Json格式的数据,方法如下:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Model;
namespace Utility
{
   public class JsonTools
    {
       /// <summary>
       /// 用对象的全部属性和属性值填充json数据
       /// </summary>
       /// <param name="o">目标对象</param>
       /// <returns></returns>
       private List<string> GetObjectProperty(object o) {
           List<string> propertyList = new List<string>();
           PropertyInfo[] propertys = o.GetType().GetProperties();
           foreach (PropertyInfo pro in propertys) {
               propertyList.Add("\""+pro.Name.ToString()+"\":\""+pro.GetValue(o,null)+"\"");
           }
           return propertyList;
       }

       /// <summary>
       /// 获取一个Object的json格式
       /// </summary>
       /// <param name="o">需要输出的目标对象</param>
       /// <returns>json格式的字符串</returns>
       public string GetOneObjectJson(object o) {
           string result = "{";
           List<string> propertys = new List<string>();
           propertys = GetObjectProperty(o);
           foreach (string pro in propertys) {
               if (result.Equals("{"))
               {
                   result = result + pro;
               }
               else {
                   result = result + "," + pro;
               }
           }
           return result + "}";
       }

       public string ToJson(List<object> objectList){
           return ToJson(objectList, string.Empty);
       }

       public string ToJson(List<object> objectList,string className){
           string result="{";
           if(className.Equals(string.Empty)){
             className=objectList[0].GetType().ToString();
           }
           result+="\""+className+"\":[";
           bool fistLine=true;
           foreach(object oo in objectList){
             if(fistLine){
                 result=result+GetOneObjectJson(oo)+"";
                 fistLine=false;
             }
               else {
                  result = result + "," + GetOneObjectJson(oo);
             }
           }
           return result + "]}";
       }
    }
}

 

写完了,先try一下报错了,由于我的T中包含了另一复杂对象,而写的这两个方法不能将对象中的对象序列化,不能实现我想要的,罢了,再查查。

发现3.5中提供了现有的类库,首先引用 System.ServiceModel.Web 这个引用熟悉吧,WCF 中用的是System.ServiceModel,它包括了对数据契约的定义,

添加这个引用后就可以使用System.Runtime.Serialization.Json命名空间下的DataContractJsonSerializer了,当然这里是把自己定义的实体类当作数据契约处理了,所以需要在实体类中加上相应的属性,以保证实体类可以被序列化,好了自己写两个方法一个用于序列化,一个用于反序列化:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
namespace Utility
{
   public class Serializder
    {
      public static string EntityToJson<T>(T obj) where T : new()
        {
           var ds = new DataContractJsonSerializer(typeof(T));
            using (var ms = new MemoryStream())
            {
                ds.WriteObject(ms, obj);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }

        public static T JsonToEntity<T>(string jsonStr)
        {
            var ds = new DataContractJsonSerializer(typeof(T));
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonStr));
            var obj = (T)ds.ReadObject(ms);
            ms.Close();
            return obj;
        }

    }
}


 写完测试,通过效果如下:

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!