C#解析JSON字符串总结

81 篇文章 1 订阅

 

目录

 C#解析JSON字符串总结 JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。

 实体生成 :

转换为实体

数组形式的JSON实体类 互转


 C#解析JSON字符串总结
 
JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。

 C#解析JSON字符串总结
 
JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。
 
操作JSON通常有以下几种方式:
 
1. 原始方式:按照JSON字符串自己来解析。
 
  string json = JsonConvert.SerializeObject(o);//实体
 
2. 通用方式【★★★★★】:这种方式是使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后添加dll引用就能用。
 
首先添加引用:using Newtonsoft.Json;
 
新增:本地dll下载:Newtonsoft.Json.rar   引用:using Newtonsoft.Json;
 
 
 
1.Json字符串普通格式解析(常用)
 
string jsonText = "{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["zone"].ToString();
string zone_en = jo["zone_en"].ToString();
 
 
 
其他写法:
复制代码
 
   int retCode = -1;//返回码,0表示成功,其他表示失败
            string returnMessage = string.Empty;//返回消息,对返回码的描述
            string jsonStr = "{\"RetCode\":3,\"ReturnMessage\":\"测试消息\"}";
            JavaScriptObject jsonObj = JavaScriptConvert.DeserializeObject<JavaScriptObject>(jsonStr);
            if (jsonObj != null)
            {
                if (jsonObj.ContainsKey("RetCode") && jsonObj["RetCode"] != null)
                {
                    int.TryParse(jsonObj["RetCode"].ToString(), out retCode);
                }
 
                if (jsonObj.ContainsKey("ReturnMessage") && jsonObj["ReturnMessage"] != null)
                {
                    returnMessage = jsonObj["ReturnMessage"].ToString();
                }
            }
 
复制代码
 
 
 
解析Josn列表数据:
 
public static JArray GetData2JArray(string url, string key)
{
    string jsonData = HttpHelper.HttpGet(url, "", "gb2312"); 
    JObject obj = JObject.Parse(jsonData);
    return (JArray)obj[key];
}
 
以上Json的返回的数据:
复制代码
 
{"Pictures":
[
{"PictureSrc":"http://i.ssimg.cn/ssupload/2016/10/17/707f464645f44b4cb9882b75d23ed8f9.png","PictureLink":"","PictureAlt":"通光线缆 36.50%","PictureTitle":"实盘赛冠军直播室","PictureTitleLink":"132","PictureSummary":"荷塘月色直播室是由野马和荷塘月色夫妻俩共同直播的直播室,野马以短线股为主,荷塘月色以中线股为主,擅于抓涨停板和翻倍牛股。","OrderTime":"2016-10-17 13:16:04"},
{"PictureSrc":"http://i.ssimg.cn/ssupload/2016/10/17/4c38b0a2604e49beaf1e4f7885e6a1a4.png","PictureLink":"","PictureAlt":"天际股份 6.38%","PictureTitle":"证券之星最强王牌播主","PictureTitleLink":"1716","PictureSummary":"深入股海数年,拥有十余年的实战经验。2014年证券之星播主年度冠军,各大一线网站著名博客,多次接受电视台专访。","OrderTime":"2016-10-17 13:12:34"}
]
}
 
复制代码
 
解析成自定义实体类列表:
复制代码
 
#region 获取手编列表
/// <summary>
/// 获取手编列表
/// </summary>
/// <returns></returns>
public static List<Pictures> GetHandWriteList()
{
    List<Pictures> list = new List<Pictures>();
    var data = Common.LiveCastUserManageAPI.GetData2JArray(CmsApiSite, "Pictures");
    if (data != null && data.Count > 0)
    {
        foreach (var item in data)
        {
            Pictures p = new Pictures();
            if (!string.IsNullOrEmpty(item["PictureSrc"].ToString()))
            {
                p.PictureSrc = item["PictureSrc"].ToString();
            }
            list.Add(p);
        }
    }
    return list;
}
#endregion
 
复制代码
 
Pictures实体类的定义:
 
复制代码
 
    public class Pictures
    {
        /// <summary>
        /// http://i.ssimg.cn/ssupload/2016/10/17/e6500633d4cb4a918c8f45e2c71ab8f6.jpg
        /// </summary>
        public string PictureSrc { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string PictureLink { get; set; }
        /// <summary>
        /// 中色股份 53%
        /// </summary>
        public string PictureAlt { get; set; }
        /// <summary>
        /// 四季度翻倍牛股在哪里?
        /// </summary>
        public string PictureTitle { get; set; }
        /// <summary>
        /// meihaoxiangwang
        /// </summary>
        public string PictureTitleLink { get; set; }
        /// <summary>
        /// 荷塘月色直播室是由野马和荷塘月色夫妻俩共同直播的直播室,野马以短线股为主, 荷塘月色以中线股为主,擅于抓涨停板和翻倍牛股。
        /// </summary>
        public string PictureSummary { get; set; }
 
        /// <summary>
        /// 股票名称
        /// </summary>
        public string StockName { get; set; }
 
        /// <summary>
        /// 股票收益率
        /// </summary>
        public string Rate { get; set; }
 
        /// <summary>
        /// 昵称
        /// </summary>
        public string NickName { get; set; }
 
        /// <summary>
        /// 头像
        /// </summary>
        public string HeadImg { get; set; }
 
        /// <summary>
        /// 直播室名称
        /// </summary>
        public string CastRoomName { get; set; }
 
 
    }
 
复制代码
 
JSON生成实体类工具:点击>>
 
 
 
参考:序列化Json-Newtonsoft.Json
 
解析JsonArrayList
 
转换json格式为C#类
 
 
 
2.Json字符串嵌套格式解析
 
string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["beijing"]["zone"].ToString();
string zone_en = jo["beijing"]["zone_en"].ToString();
 
3.Json字符串数组格式解析
复制代码
 
string jsonArrayText = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]"; //"[{'a':'a1','b':'b1'}]即使只有一个元素,也需要加上[]
string jsonArrayText = "[{\"a\":\"a1\",\"b\":\"b1\"},{\"a\":\"a2\",\"b\":\"b2\"}]";  //上面写法和此写法效果一样
JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonArrayText);//jsonArrayText必须是带[]数组格式字符串
string str = jArray[0]["a"].ToString();
 
复制代码
foreach (var jsonitem in jArray)
{
JObject job = (JObject)jsonitem ;
 string VBELN= job["VBELN"].ToString();
}
 
 
3. 内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。
复制代码
 
Project p1 = new Project() { Input = "stone", Output = "gold" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonStr = serializer.Serialize(p1);  //序列化:对象=>JSON字符串
Response.Write(jsonStr);
 
Project p2 = serializer.Deserialize<Project>(jsonStr); //反序列化:JSON字符串=>对象
Response.Write(p1.Input + "=>" + p2.Output);
 
复制代码
 
  注意:如果使用的是VS2010,则要求当前的工程的 Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
  此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式。
 
 
 
备注:
 
json格式字符串转换为实体类,大括号{}表示对象,[]数组表示列表。

 实体生成 :

在线JSON转C#实体类,JSON转Java实体类

{"code":0,"msg":"获取","data":[11,12,13]}

转换为实体

  Json_Text jt= JsonConvert.DeserializeObject<Json_Text>(s);

数组形式的JSON实体类 互转

using System.Runtime.Serialization;
using System.Web.Script.Serialization;
 
 
 {
	"code": "200",
	"total": "2",
	"rows": [{
			"id": "31",
			"project": "6",
			"project_name": "测试",
			"name": "哈哈!",
			"assignedTo": "liming",
			"realname": "李明",
			"estStarted": "2016/11/23",
			"realStarted": "2000/01/01",
			"status": "wait",
			"title": "12165412",
			"content": "12165412",
			"type": "2",
			"curServerTime": "12165412",
			"expire": "12165412",
			"sendTime": "12165412"
		},
		{
			"id": "32",
			"project": "6",
			"project_name": "嘻嘻",
			"name": "你好",
			"assignedTo": "wangwu",
			"realname": "王五",
			"estStarted": "2016/11/23",
			"realStarted": "2016/11/23",
			"status": "wait",
			"title": "12165412",
			"content": "12165412",
			"type": "2",
			"curServerTime": "312165412",
			"expire": "12165412",
			"sendTime": "12165412"
		}
	]
}
 
//拿到json数据里面的List
int IndexofA = jsonText.IndexOf("[");
int IndexofB = jsonText.IndexOf("]");
string Ru = jsonText.Substring(IndexofA , IndexofB - IndexofA+1); 
JavaScriptSerializer Serializer = new JavaScriptSerializer();
List<Rows> objs = Serializer.Deserialize<List<Rows>>(Ru);

//拿到整个类对象
Root root = Serializer.Deserialize<Root>(jsonString);
 
 
 
//实体类
 
public class Rows
{
    /// <summary>
    /// 
    /// </summary>
    public string id { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string project { get; set; }
    /// <summary>
    /// 测试
    /// </summary>
    public string project_name { get; set; }
    /// <summary>
    /// 哈哈!
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string assignedTo { get; set; }
    /// <summary>
    /// 李明
    /// </summary>
    public string realname { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public DateTime estStarted { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public DateTime realStarted { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string status { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string title { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string content { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string curServerTime { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string expire { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string sendTime { get; set; }
}

public class Root
{
    /// <summary>
    /// 
    /// </summary>
    public string code { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string total { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public List<Rows> rows { get; set; }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AD_喵了个咪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值