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

时间:2023-01-02 10:13:48

<>

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;
}
}
}
}