C#读取JSON

181 篇文章 3 订阅

欲成为海洋大师,必知晓海中每一滴水的真名。

刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把。

搜索过程中免不了碰到一大堆名词:WCF => DataContract => DataMember => DataContractJsonSerializer,然后就是不停的引入命名空间。

这一段经历,立即让我就联想到了上面引用的这句存在于某小说里面巫师的话语。静态语言真有点令人抓狂,不停的做准备,然后才可能开始工作。

对比

主要类命名空间限制内建LINQ支持
DataContractJsonSerializerSystem.Runtime.Serialization.Json通用
JavaScriptSerializerSystem.Web.Script.Serialization只能在Web环境使用
JsonArrayJsonObjectJsonValueSystem.Json只能在Silverlight中使用
JsonConvertJArrayJObjectJValueJPropertyNewtonsoft.Json通用

.NET下几种常见的解析JSON方法

实体类:

代码 


[DataContract]
publicclass Person
{
[DataMember(Order =0, IsRequired =true)]
publicstring Name { get; set; }

[DataMember(Order =1)]
publicint Age { get; set; }

[DataMember(Order =2)]
publicbool Alive { get; set; }

[DataMember(Order =3)]
publicstring[] FavoriteFilms { get; set; }

[DataMember(Order =4)]
public Person Child { get; set; }
}


 

定义:

代码


 

Action<object> log = o => Console.WriteLine(o);
Func<int, int, int> add = (x, y) => x + y;

var p1 =new Person {
Age =12,
Alive =true,
Name ="lj",
FavoriteFilms =new[] { "Up", "Avatar" }
};
var p2 =new Person() { Age =28, Name ="cy", Child = p1 };

 


使用DataContractJsonSerializer

帮助类:

代码


 

代码 


// using System.Runtime.Serialization.Json;

///<summary>
/// 解析JSON,仿Javascript风格
///</summary>
publicstaticclass JSON
{

publicstatic T parse<T>(string jsonString)
{
using (var ms =new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
}
}

publicstaticstring stringify(object jsonObject)
{
using (var ms =new MemoryStream())
{
new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}


用法:

代码

// 序列化
var jsonString = JSON.stringify(new[] { p1, p2 });
log(jsonString == JSON.stringify(new List<Person>() { p1, p2 })); //true
log(jsonString);
// 反序列化,泛型集合
JSON.parse<List<Person>>(jsonString);
// 数组转换 
JSON.parse<Person[]>(jsonString);


 

输出:

[{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null
},{"Name":"cy","Age":28,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj",
"Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null}}]


使用JavaScriptSerializer

// using System.Web.Script.Serialization;

var jser =new JavaScriptSerializer();
var json = jser.Serialize(new List<Person>() { p1, p2 });
var persons = jser.Deserialize<List<Person>>(json);


使用Silverlight

代码 


// using System.Json

var css ="{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";

var style = JsonObject.Parse(css) as JsonObject; 

(
from s in style
where s.Key =="color"
select (string)s.Value
).First().ToString(); 
// "cyan"


// 更多操作
style["layout"][0] =22;

var hd = style["#header"];
style["body>div+p"] = hd;
style.Remove("#header");

var bd =new JsonObject();
bd["border"] ="1px solid cyan";
style["body>div+p"]["#meta"] = bd;
style.ToString(); 
// {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}


使用JSON.NET

// using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(new[] { p1, p2 });
var persons = JsonConvert.DeserializeObject<List<Person>>(json);
var ja = JArray.Parse(jsonString); 
log(ja); //注意,格式化过的输出


输出:

代码

代码 


[
{
"Name": "lj",
"Age": 12,
"Alive": true,
"FavoriteFilms": [
"Up",
"Avatar"
],
"Child": null
},
{
"Name": "cy",
"Age": 28,
"Alive": false,
"FavoriteFilms": null,
"Child": {
"Name": "lj",
"Age": 12,
"Alive": true,
"FavoriteFilms": [
"Up",
"Avatar"
],
"Child": null
}
}
]


LINQ:

var ageCount = ja.Select(j => (int)j["Age"]).Aggregate(add); 
var q = from j in ja
where!j["Name"].Value<string>().Equals("lj")
select (int)j["Age"];

log(q.Aggregate(add) == ageCount); //false


其他:

代码 


// 与Linq to XML 相似的嵌套构造函数:
var jo =new JObject(
new JProperty("age", persons.Select( p => p.Age)),
new JProperty("funny", true),
new JProperty("array", new JArray(new[] { 2, 4, 1 }))
);
log(jo);

// JObject 操作
var css ="{ \"#header\" : {background:\"red\"}, layout : [5,4,1] }";
var style = JObject.Parse(css);

var bd =new JObject();
bd["color"] ="1px solid cyan";

style["border"] = bd;

var hd = style["#header"];
style["body>div+p"] = hd;

hd.Parent.Remove();

style["layout"][0] =22;
log(style);


输出:

代码 



{
"age": [
,

],
"funny": true,
"array": [
,
,

]
}
{
"layout": [
,
,

],
"border": {
"color": "1px solid cyan"
},
"body>div+p": {
"background": "red"
}
}





 

C#可以使用Newtonsoft.Json和LitJson两个库来读取JSON文件。其中,Newtonsoft.Json是一个流行的第三方库,而LitJson是一个轻量级的JSON库。下面是使用Newtonsoft.Json读取JSON文件的示例代码: 1. 首先需要在项目中安装Newtonsoft.Json库。 2. 然后,可以使用以下代码读取JSON文件,并将其反序列化为Person类型的对象: ``` using Newtonsoft.Json; using System.IO; // 读取 JSON 文件 string jsonFilePath = "example.json"; using (StreamReader sr = new StreamReader(jsonFilePath)) { string json = sr.ReadToEnd(); // 解析 JSON 字符串 var person = JsonConvert.DeserializeObject<Person>(json); // 获取某一个关键字的值 Console.WriteLine(person.Name); } ``` 其中,Person是一个自定义的类,需要根据JSON文件的结构来定义。 另外,如果使用LitJson库,可以使用以下代码读取JSON文件: ``` using LitJson; using System.IO; // 读取 JSON 文件 string jsonFilePath = "example.json"; using (StreamReader sr = new StreamReader(jsonFilePath)) { string json = sr.ReadToEnd(); // 解析 JSON 字符串 JsonData jsonData = JsonMapper.ToObject(json); // 遍历数组信息 foreach (JsonData temp in jsonData) { // 获取某一个关键字的值 int id = Int32.Parse(temp["id"].ToString()); string name = temp["name"].ToString(); int number = Int32.Parse(temp["number"].ToString()); // 输出 Console.WriteLine(id + ":" + name + ":" + number); } } ``` 其中,JsonData是LitJson库中的一个类,表示JSON数据。需要根据JSON文件的结构来获取其中的关键字的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值