练习如下:手上有一串JSON数据,我需要将它转化为集合,同时也要发送到前台进行浏览。
——————————————————————————————————————————————
前提:
首先在项目中创建一个JSON文件,具体的json数据放到博客最后。
因为使用的是c#,在使用前需要引用对应的dll:Newtonsoft.Json,官网地址,也可以通过NuGet的方式直接PM下载:
PM> Install-Package Newtonsoft.Json |
成功后就可以引用对应的dll库:
using Newtonsoft.Json;
或者
using Newtonsoft.Json.Linq;
//注意这两种在使用时有所区别,下文提到。
——————————————————————————————————————————
将JSON转泛型集合:
在后台直接转化为泛型集合列表——List<T>:
因为我们要把JSON转化为List<T>,所以自然要建立一个对应的类来表示JSON中的对象。
一个简便的办法是复制JSON数据后直接【编辑】-》【选择性粘贴】-》【将JSON粘贴为类】(类似的也有将xml粘贴为类的方法)。
注意这样生成的类,最外层是Rootobject,不一定要使用,看需要删去。 |
我们将下述json数据(文末)定义成了这样的类:
public class stuTable {
public string Name { get; set; }
//方式一:
public List<Student> Students { get; set; }
//方式二
public Student[] Students{ get; set; }
}
public class Student
{
public string Name { get; set; }
public string Gender { get; set; }
public string Age { get; set; }
}
注意,因为JSON数据是【数组--对象--键值对/键值(数组对象)对】的形式,因此我们定义的对象类中需要一个里层的泛型集合列表(或者是数组对象)。同时也要注意给出public的访问权限,因为public class默认类内权限是private。
在C++中用class定义的类中,其成员的默认存取权限是private; 另外,struct定义的结构体是值类型,效果与类相似。 减少了托管堆的负担,适用于较小的对象。 |
类创建好后我们就要去读取它。
因为json为本地文件,我们需要本地访问它,同时防止访问空对象,我们需要添加异常处理:
//添加IO的库
using System.IO;
…………………………
try
{
Encoding encoding = Encoding.Default;
String url = "/01work/控制台AllTest/控制台AllTest/json1.json";
StreamReader SR = new StreamReader(url);
String content = SR.ReadToEnd();
SR.Dispose();
/*
*转换代码区
*/
Console.Write("结果一:纯文件读取:"+content);
Console.Read();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
这个时候,我们将JOSN文件读取出来,并以字符串的方式储存在content中,读取后及时释放TextReader的资源。
现在读取到了,类也有了,引用的Newtonsoft.Json库也有了,自然就该转换了。
两种转换方式:
using Newtonsoft.Json;
//注意两种方式引用库文件的不同
————————————————————
//在上述的转换代码区添加
List<stuTable> stuTables = JsonConvert.DeserializeObject<List<stuTable>>(content);
上面这种是直接用JsonConvert方法。
using Newtonsoft.Json.Linq;
//注意两种方式引用库文件的不同
————————————————————
//在上述的代码区添加
JArray jArray = JArray.Parse(content);
List<stuTable> stuTables = new List<stuTable>();
stuTables = jArray.ToObject<List<stuTable>>();
上面这种方式是先转换为JArray,然后再转换为List<>泛型集合列表。
JArray似乎和LINQ有关,我目前还没接触过LINQ,未来将对此进行了解。
上述两种方式的结果:(直接通过断点运行查看结果)
因为不能截图,无法上结果,但是如果顺利的话,通过断点可以查看到json数据已经转换到集合中了。
——————————————————————————————————————————