c#中将【对象转成 JSON 格式的字符串】 及获取Json格式字符串并将转成Json对象 及对js数组取数据

30 篇文章 0 订阅
5 篇文章 0 订阅

<>

 

string str= {"Json":[{"UserName":"张三"},{"UserName":"王五"}]}

怎么获取这个“张三”

答: var obj=$.parseJSON(str) //将str这个字符串转换成Json对象;

obj.Json[0].UserName 就获取到了“张三”    因为obj.Json的值是一个数组,数组里面有两个元素,而这两个元素又都是json对象

---------------------------------------------------------------------

有一个页面GetData.ashx,它输出一下字符串:

[{"Id":1,"UserName":"无盐海","Name":"Fanbin","Age":26},{"Id":2,"UserName":"Echo","Name":"JouJ","Age":25}]

那在客户端怎么使用这条字符串的数据呢?

 

 $(function () {
    $.post("GetData.ashx", { pageSize: 10, pno: 1 }, function (data) {
		
		//这个data就是这条数据: [{"Id":1,"UserName":"无盐海","Name":"Fanbin","Age":26},{"Id":2,"UserName":"Echo","Name":"JouJ","Age":25}]
		
		//这里将data这个字符串转换成Json对象,这个Json对象里有两条数据,[]里面的每个{}括号为一条数据
        var jsonData = $.parseJSON(data);
		
		//遍历JsonDdata这个Json对象 
        $.each(jsonData, function (key, val) {
            var strTb = "<tr><td>" + val.Id + "</td><td>" + val.UserName + "</td><td>" + val.Name + "</td><td>" + val.Age + "</td></tr>"
            $("#t1").append(strTb);
        })
    })
})

 

有一个页面GetData.ashx  它除数以下字符串:

 

{"countPage":3,"list":[{"Id":1,"UserName":"无盐海","Name":"Fanbin","Age":26},{"Id":2,"UserName":"Echo","Name":"JouJ","Age":25}]}

在客户端怎么使用这条数据呢?

 

$(function () {
    $.post("GetData.ashx", { pageSize: 10, pno: 1 }, function (data) {
        //这个data就是这条字符串 {"countPage":3,"list":[{"Id":1,"UserName":"无盐海","Name":"Fanbin","Age":26},{"Id":2,"UserName":"Echo","Name":"JouJ","Age":25}]}

        //将data这个字符串转换成json对象
        var jsonData = $.parseJSON(data);

        alert(jsonData.countPage); //这里输出:3  通过这个jsonData对象用.的形式来获取它的第一条数据的值

        //那么这个jsonData.list自然就获取到了第二条数据了,它的值是[{"Id":1,"UserName":"无盐海","Name":"Fanbin","Age":26},{"Id":2,"UserName":"Echo","Name":"JouJ","Age":25}]

        //遍历第二条数据(遍历jsonData.list)
        $.each(jsonData.list, function (key, val) {
            var strTb = "<tr><td>" + val.Id + "</td><td>" + val.UserName + "</td><td>" + val.Name + "</td><td>" + val.Age + "</td></tr>"
            $("#t1").append(strTb);
        })
    })
})

 

 

景慧毅告诉转的JSON序列号器Jil

 

使用Jil.JSON.Serialize()来对对象序列化需要通过安装插件 PM> Install-Package Jil -version 2.10.0  

 var strJson = Jil.JSON.Serialize(x);  

 

eval()  JSON.parse()   $.parseJSON()将字符串转换Json对象

 

<script type="text/javascript">
    var jsonStrA = '{"JsonData":[{"name":"洪七公","age":window.location.href="http://www.baidu.com"}]}';

    var jsonStrB = '{"JsonData":[{"name":"洪七公","age":alert(123)},{"name":"郭靖","age":15}]}';

    var jsonStrC = '{"JsonData":[{"name":"洪七公","age":80},{"name":"郭靖","age":15}]}';


    var JsonObjEval = eval('(' + jsonStrB + ')');
    JsonObjEval.JsonData[0].age; //这里会弹出一个对话框,内容为:123

    //eval不会去看你的json字符串是否合法,而且json字符串里的一些js方法会直接执行,比如这里就执行了alert(123) 所以这非常危险,所以尽量少用,除非你能确定eval的参数确实是自己可以控制的,是安全的。尤其是你用eval方法执行第三方的json数据有可能包含恶意代码,比如说某个参数值是window.location.href跳转到一个恶意的地址。所以尽量使用以下两种方法

    //var JsonObjA = JSON.parse(jsonStrA);//报错: SyntaxError: JSON.parse: unexpected character at line 1 column 34 of the JSON data(提示json字符串不合法)

    //var JsonObjB = $.parseJSON(jsonStrB); //报错: SyntaxError: JSON.parse: unexpected character at line 1 column 34 of the JSON data(提示json字符串不合法)

    var JsonObjC = JSON.parse(jsonStrC);

    alert(JsonObjC.JsonData[0].name); //输出:洪七公

    alert(JsonObjC.JsonData[1].age);  //输出:15

    //JSON.parse()与$.parseJSON()可以解析json格式的数据,并且会对要解析的字符串进行格式检查,格式不正确会报错。

</script>

 

 

 

 

<1>c#中将对象转成Json格式的字符串【JavaScriptSerializer】

参考资料:JavaScriptSerializer中日期序列化问题解决方案

在控制台应用程序中需要添加引用:System.Web.Extensions 程序集。

 

salesEntities1 db = new salesEntities1(); //ADO实体模型类
var list = db.T_User; //查出T_User这个表(类)的所有数据

//创建Json序列化器,将对象转换成一个Json格式的字符串  
JavaScriptSerializer jsz = new JavaScriptSerializer();  
  
var str= jsz.Serialize(list); //将一个list对象转换成json格式的字符串  
  
//context.Response.Write(str); 

//如果list中日期(DateTime)类型的字段,我们就需要对日期类型的字段进行格式化了

var jsonData = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
{
    DateTime dt = new DateTime(1970, 1, 1);
    dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
    dt = dt.ToLocalTime();
    return dt.ToString("yyyy-MM-dd HH:mm:ss");
});
return jsonData;

 

 

 

 

 

 

<2> C#中将对象转化成Json格式的字符串  【JsonSerializerSettings】 

 

   public class Json
    { 
       /// <summary>
       /// 将对象转换成Json格式的字符串
       /// </summary>
       /// <param name="obj">要转换的对象</param>
       /// <returns></returns>
       public static string ToJson(object obj)
       {
           JsonSerializerSettings settings = new JsonSerializerSettings();
           settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
           return JsonConvert.SerializeObject(obj);
       }
       /// <summary>
       /// 将DataTable 转换成一个Json格式的字符串
       /// </summary>
       /// <param name="dt"></param>
       /// <param name="records"></param>
       /// <returns></returns>
       public static string ToJson(System.Data.DataTable dt, int records)
       {
          string json = ToJson(dt);
           return @"{""total"":"+records.ToString()+@",""rows"":"+json+"}";
       }
   }

 

 

 

<3>c#中将对象转成Json格式的字符串【Newtonsoft.Json.JsonConvert.SerializeObject】

 

 

Customer customer = new Customer 
      { Unid=1,CustomerName="宋江",Memo="天魁星",Other="黑三郎"};
string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(customer);

context.Response.Write(strJson);

 

 

 

 

<4>将从EF里查询出来的一个泛型对象转化成Json格式的字符串

 

 

using MvcTest.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;

namespace MvcTest.Controllers
{
    public class HomeController : Controller
    {
        salesEntities1 db = new salesEntities1();
        //
        // GET: /Home/

        public ActionResult Index()
        {
            //(query实际上的类型是:interface System.Linq.IQueryable<out T>)
            var query = from q in db.T_User   //查询T_User这个表。得到一个query 泛型对象。
                        select q;

            //将这个泛型对象转化成一个Json格式的字符串
            JavaScriptSerializer jsz = new JavaScriptSerializer();  
          
            //我只要要转换query 就可以了,可是这样得到的数据就是一个键值对数组。不信就看下面这句代码。
            //var JsonData = jsz.Serialize(query);  //将
            //通过调试得知jsonData的值为[{"Id":1,"UserName":"张三","Age":25,"Gender":0},{"Id":2,"UserName":"李四","Age":26,"Gender":1}]

            //那我现在想得到一个 {"total":2,"rows":[{"Id":1,"UserName":"张三","Age":25,"Gender":0},{"Id":2,"UserName":"李四","Age":26,"Gender":1}]}
            //所以就的处理一下。
            //new 一个匿名类对象 它里面有两个属性 一个是total 值为query.Count(),另外一个是 rows 值为 query这个泛型对象。
            //然后我用 var x 来指向 这个匿名类对象。   即: var x=new { total=query.Count(),rows=query};
            //最后我们来将这个x 对象转化成一个json格式的字符串。就OK了。   即:var jsonData = jsz.Serialize(x);

            var x = new { total = query.Count(), rows = query };
            var jsonData = jsz.Serialize(x);

            //调试得知:jsonData的值为:{"total":2,"rows":[{"Id":1,"UserName":"张三","Age":25,"Gender":0},{"Id":2,"UserName":"李四","Age":26,"Gender":1}]}
            
            return View();
        }

    }
}

 

当实体中有导航属性的时候,将从EF查询出来是对象序列化的时候会出现错误。解决这个文件的方式就是在导航属性上打上一个特性标签

 

//------------------------------------------------------------------------------
// <auto-generated>
//    此代码是根据模板生成的。
//
//    手动更改此文件可能会导致应用程序中发生异常行为。
//    如果重新生成代码,则将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------

namespace WebAPI.Models
{
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    
    public partial class T_UserInfo
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public int Gender { get; set; }
        public string Mobile { get; set; }
        public string Email { get; set; }
        public string Addres { get; set; }
        public string Reamarks { get; set; }
        public int LoginId { get; set; }

        [JsonIgnore] //打上这个特性标签就可以将对象转Json的序列化了
        public virtual T_UserLogin T_UserLogin { get; set; }
    }
}

 

 

 

 

 

=========================================================================================

 

<5>(AJAX请求)获取Json格式字符串并将转成Json对象  及对js数组取数据

 

<!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 src="jquery-1.11.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        function btnClick(){
            var xmlhttp = new XMLHttpRequest();
            

            if(!xmlhttp)
            {
                alert("创建xmlhttp对象异常");
                return false;
            }
            
            xmlhttp.open("POST", "Handler2.ashx", false); 
            xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            xmlhttp.onreadystatechange = function () {

                if (xmlhttp.readyState == 4) {

                    if (xmlhttp.status == 200) {

                        var str = xmlhttp.responseText; // 通过alert(str)得知 str={"Json":[{"UserName":"张三"}]}
                        //debugger;
                        var obj = $.parseJSON(str); //将str这个字符串转换成Json对象 

                        var name = obj.Json[0].UserName; //obj.Json取到的是[{"UserName":"张三"}] 这个数组,数组里只有一个值{"UserName":"张三"}   所以obj.Json[0]的值就是{"UserName":"张三"} ; 而这个{"UserName":"张三"} 是一个对象,所以可以通过 .UserName来获得 "张三" 这个值

                        document.getElementById("div1").innerHTML = name;
                        
                    }
                    else {
                        alert("ajax服务器错误");
                    }
                }

            }
            xmlhttp.send("id=2");   
            
        }
    </script>
</head>
<body>
<form>
<div id="div1">sds</div>
<input type="button" onclick="btnClick()" />
</form>

</body>
</html>

 

 

 

 

 

Handler2.aspx.cs

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;

namespace IsPostBack
{
    /// <summary>
    /// Handler2 的摘要说明
    /// </summary>
    public class Handler2 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            int id = Convert.ToInt32(context.Request["id"]);
            context.Response.ContentType = "text/html";
            context.Response.Write(GetName(id));
        }

        string GetName(int id)
        {
           DataTable dt= (DataTable) SqlHelper.ExecuteDataTable("select UserName from T_User where id=@id", new SqlParameter("id", id));


           //var Json = DtToJson.ToJson(dt);
           var Json = DataTableConvertJson.DataTableToJson("Json", dt);

           return Json;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

 

 

 

 

 

 

 





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值