C# 读取本地json文件

rijiwook 2015-08-10 09:25:14
论坛上的各位大大你们好
小弟,从大疆官网上下载了中国禁飞区的JSON文件,是保存在本地的JSON文件的主要内容如下:
{
"status": 0,
"data": [
{
"id": 141,
"type": 0,
"lat": "30.322501",
"lng": "109.485498",
"country": "CN",
"city": "Enshi",
"name": "Enshi Airport",
"runway_length": 1477,
"warning": 0,
"level": 0,
"disable": 0,
"unix_timestamp": 1429598268,
"begin_at": null,
"end_at": null,
"points": null,
"bdlng": 109.49204617101,
"bdlat": 30.328257837853
},
{
"id": 153,
"type": 0,
"lat": "36.637356",
"lng": "109.554365",
"country": "CN",
"city": "Yan'an",
"name": "Yan'an Airport",
"runway_length": 1564,
"warning": 0,
"level": 0,
"disable": 0,
"unix_timestamp": 1429598268,
"begin_at": null,
"end_at": null,
"points": null,
"bdlng": 109.56077741485,
"bdlat": 36.643676339282
},
{
"id": 393,
"type": 0,
"lat": "25.934999",
"lng": "119.66333",
"country": "CN",
"city": "Fuzhou",
"name": "Fuzhou Changle International Airport",
"runway_length": 2062,
"warning": 0,
"level": 0,
"disable": 0,
"unix_timestamp": 1429598269,
"begin_at": null,
"end_at": null,
"points": null,
"bdlng": 119.66981719681,
"bdlat": 25.941124836113
},

后边还有很多,总共有198个类似的结构体

我自己写的C#代码中,有一个初始化函数,该函数主要的执行功能是,将JSON文件中的 lat lng runway_length读取出来,并且赋值给我的结构体链表

这个初始化函数为:
private static List<AirportInfo> AirportInitialization()
{
List<AirportInfo> airport = new List<AirportInfo>();
AirportInfo air = new AirportInfo();

for(int i = 0 ; i < 198 ; i++) //暂定为198个
{
//air.Lat = database或txt中对应的值
//air.Lng = database或txt中对应的值
//air.Radius = database或txt中对应的值
airport.Add(air);
}
return airport;
}

那么,我想请教一下,我应该在这个初始化函数内部如何读取本地的JSON文件,并且循环赋值给我这个air的结构体链表

谢谢各位,新手第一次接触JSON文件,网络上也查找了一些资料,但是感觉都没办法用
...全文
18054 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2015-08-11
  • 打赏
  • 举报
回复

private List<xxx> GetXXXsFromText(string strText){
    List<xxx> lst = new List<xxx>;
    foreach(Match m in Regex.Matches(strText,@"{.*?}",RegexOptions.IgonreCase | RegexOptions.Singeline)){
        xxx x = new xxx();
        x.lat = Regex.Match(m.Value,@"""lat"":\s*""(.*?)""").Group[1].Value;
        x.lng = Regex.Match(m.Value,@"""lng"":\s*""(.*?)""").Group[1].Value;
        x.runway_length = Regex.Match(m.Value,@"""runway_length"":\s*""(\d+)""").Group[1].Value;
        lst.Add(x);
    }
}
直接手打的代码 估计有错。。反正我习惯直接用正则去匹配
  • 打赏
  • 举报
回复
引用 25 楼 u012456572 的回复:
/// <summary> /// 序列化帮助类 /// </summary> public class SerializerHelper { /// <summary> /// 将数据集转换成JSON格式字符串 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="data">数据集</param> /// <returns></returns> public static string GetJsonData<T>(T data) where T:class, new () { JavaScriptSerializer serializer = new JavaScriptSerializer(); string result = serializer.Serialize(data); return result; } /// <summary> /// 将JSON格式字符串转换成指定类型数据集 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="data">JSON格式字符串</param> /// <returns></returns> public static T GetModelData<T>(string data) where T : class,new() { JavaScriptSerializer serializer = new JavaScriptSerializer(); T result = new T(); result = serializer.Deserialize<T>(data); return result; } }
T就是你的数据类型
  • 打赏
  • 举报
回复
/// <summary> /// 序列化帮助类 /// </summary> public class SerializerHelper { /// <summary> /// 将数据集转换成JSON格式字符串 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="data">数据集</param> /// <returns></returns> public static string GetJsonData<T>(T data) where T:class, new () { JavaScriptSerializer serializer = new JavaScriptSerializer(); string result = serializer.Serialize(data); return result; } /// <summary> /// 将JSON格式字符串转换成指定类型数据集 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="data">JSON格式字符串</param> /// <returns></returns> public static T GetModelData<T>(string data) where T : class,new() { JavaScriptSerializer serializer = new JavaScriptSerializer(); T result = new T(); result = serializer.Deserialize<T>(data); return result; } }
始于千里之外 2015-08-11
  • 打赏
  • 举报
回复
如果是标准的json合适,可以用三楼的办法,直接转成自定义的Object后读属性即可
於黾 2015-08-10
  • 打赏
  • 举报
回复
引用 19 楼 rijiwook 的回复:
[quote=引用 18 楼 Z65443344 的回复:] 你用什么软件打开的这个文件,记事本吗
恩,这个文件格式是.JSON,我用记事本打开的[/quote] 不要说什么文件格式是json.只不过文件扩展名是.json罢了 文件格式明显是文本文档,否则你用记事本打开会是乱码 所以你就按读txt文本的方式读出来就行了 至于json格式的字符串如何反序列化,前面已经说了很多了
rijiwook 2015-08-10
  • 打赏
  • 举报
回复
引用 18 楼 Z65443344 的回复:
你用什么软件打开的这个文件,记事本吗
恩,这个文件格式是.JSON,我用记事本打开的
於黾 2015-08-10
  • 打赏
  • 举报
回复
你用什么软件打开的这个文件,记事本吗
宝_爸 2015-08-10
  • 打赏
  • 举报
回复
.JSON这个估计都是自己起的吧,你可以可以新建个文本文件,写点东西进去,改名成***.json
宝_爸 2015-08-10
  • 打赏
  • 举报
回复
看起来这个.json存的就是文本了,读取到string,在反序列化就可以了。 读取: File.ReadAllText 反序列化: Json.net, 一下例子代码来自: http://www.newtonsoft.com/json string json = @"{ 'Name': 'Bad Boys', 'ReleaseDate': '1995-4-7T00:00:00', 'Genres': [ 'Action', 'Comedy' ] }"; Movie m = JsonConvert.DeserializeObject<Movie>(json); string name = m.Name; // Bad Boys
rijiwook 2015-08-10
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
如果楼主经常要用到 json,那么就不会在这里问了(现成的工具很多,但用起来都过于繁琐) 你只要每组的三个数据,直接正则提取就是了。何必找那些麻烦
我这是第一次使用这种文件格式。。。 这是别人教我,从大疆的网站上获取的数据 他传给我的文件就是一个Asia-CN-NOFLY.json这样的文件,文件的后缀名是.JSON 文件里的内容,是我上边贴的那种,JSON这种文件格式,我也是第一次接触,确实不知道该怎么用 还有,您所说的正则提取,我也是第一次听说。。。 小白,确实有很多东西需要跟这里的各位大牛多学习一下
老李家的小二 2015-08-10
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
将文本内容读取出来作为字符串,然后用json序列化dll进行反序列化,比如Newtonsoft.Json
推荐使用此dll,可以网上找一下相关的解析例子。
於黾 2015-08-10
  • 打赏
  • 举报
回复
楼主根本没搞明白所谓的.json文件到底是个什么格式 这不是系统默认的格式,而是个自定义的格式 谁给的这个格式的文件的,你去问他,里面到底存的是个什么玩意,再对应的读取
xuzuning 2015-08-10
  • 打赏
  • 举报
回复
如果楼主经常要用到 json,那么就不会在这里问了(现成的工具很多,但用起来都过于繁琐) 你只要每组的三个数据,直接正则提取就是了。何必找那些麻烦
Imcx 2015-08-10
  • 打赏
  • 举报
回复
转结构体则需要创建同名变量,除了[],其他的值都可以以string创建,记得创建为公共的属性 []里的内容我是创建的LIst<object>不知道能不能用其他的类型
Imcx 2015-08-10
  • 打赏
  • 举报
回复
也不一定要转成结构体 引用Newtonsoft.Json 然后Hashtable myJson = JsonHelper.Json2Object<Hashtable>(jsonLines); 取值的时候用myJson["索引名"] .ToString();这样
_lee_chong 2015-08-10
  • 打赏
  • 举报
回复
引用 7 楼 rijiwook 的回复:
[quote=引用 6 楼 edlyly 的回复:] 你把json保存在txt里面再读出来作为字符串处理,不管是什么类型的,最终都是通过字符串来处理。你可以把字符串放到泛型集合里面来处理。 需要引用using System.Web.Script.Serialization;下面是方法 public static T JSONStringToT<T>(this string JsonStr) { JavaScriptSerializer Serializer = new JavaScriptSerializer(); T objs = Serializer.Deserialize<T>(JsonStr); return objs; } 转化T之后,然后你再把你那些数据生成model来处理。
看不懂啊。。。 我现在了解到的,好像是,先把JSON文件(我本地的文件格式就是.JSON 里面的数据格式是JSON数据格式?实际上里面的数据格式,就是我上边贴的数据)按照文本文件读取出来,然后,再进行反序列化,转换成结构体? 是这个意思吗?那么,读取出来的字符串流,如何转换成结构体呢。。。[/quote] 你都查到反序列化了,还未怎么转换结构体,反序列化不就自动转了,去实现吧
_lee_chong 2015-08-10
  • 打赏
  • 举报
回复
c# json 序列化/反序列化
rijiwook 2015-08-10
  • 打赏
  • 举报
回复
引用 6 楼 edlyly 的回复:
你把json保存在txt里面再读出来作为字符串处理,不管是什么类型的,最终都是通过字符串来处理。你可以把字符串放到泛型集合里面来处理。 需要引用using System.Web.Script.Serialization;下面是方法 public static T JSONStringToT<T>(this string JsonStr) { JavaScriptSerializer Serializer = new JavaScriptSerializer(); T objs = Serializer.Deserialize<T>(JsonStr); return objs; } 转化T之后,然后你再把你那些数据生成model来处理。
看不懂啊。。。 我现在了解到的,好像是,先把JSON文件(我本地的文件格式就是.JSON 里面的数据格式是JSON数据格式?实际上里面的数据格式,就是我上边贴的数据)按照文本文件读取出来,然后,再进行反序列化,转换成结构体? 是这个意思吗?那么,读取出来的字符串流,如何转换成结构体呢。。。
edlyly 2015-08-10
  • 打赏
  • 举报
回复
你把json保存在txt里面再读出来作为字符串处理,不管是什么类型的,最终都是通过字符串来处理。你可以把字符串放到泛型集合里面来处理。 需要引用using System.Web.Script.Serialization;下面是方法 public static T JSONStringToT<T>(this string JsonStr) { JavaScriptSerializer Serializer = new JavaScriptSerializer(); T objs = Serializer.Deserialize<T>(JsonStr); return objs; } 转化T之后,然后你再把你那些数据生成model来处理。
rijiwook 2015-08-10
  • 打赏
  • 举报
回复
引用 4 楼 Imcx_ 的回复:
json是数据格式,不是文件格式 你保存json数据的文件是什么格式呢?
我本地保存的文件格式,就是.JSON文件格式 该文件里面有主楼里,我贴的那些数据
加载更多回复(8)

110,559

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧