C# json解析与生成json字符串

  在C#中使用Newtonsoft.Json解析JSON,首先需要安装Newtonsoft.Json NuGet包。可以通过以下步骤进行安装:
  (1) 打开Visual Studio项目。
  (2) 在“解决方案资源管理器”中,右键单击项目,然后选择“管理NuGet程序包”。在NuGet包管理器中,搜索“Newtonsoft.Json”。找到Newtonsoft.Json包,点击安装按钮。
  如下图
在这里插入图片描述

  安装完成后,就可以在C#代码中使用Newtonsoft.Json来解析JSON了。

简单json解析

  例如下面的json字符串:

{
    "name":"jack",
    "age":30,
    "city":"New York"
}

  C# 解析代码

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // JSON字符串
            string json = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";

            // 解析JSON
            var obj = JsonConvert.DeserializeObject<JObject>(json);

            // 获取属性值
            string name = obj["name"].ToString();
            int age = Convert.ToInt32(obj["age"]);
            string city = obj["city"].ToString();

            // 输出结果
            Console.WriteLine($"Name: {name}");
            Console.WriteLine($"Age: {age}");
            Console.WriteLine($"City: {city}");
        }
    }
}

  在上面的示例中,先引入了Newtonsoft.Json的名字空间

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

  然后使用JsonConvert.DeserializeObject方法传入泛型JObject将JSON字符串解析为一个动态对象, 通过访问动态对象的属性,可以获取JSON中的值。

复杂json解析

  对于简单的json的可以直接解析, 复杂的json, 建议用先创建json对应的类,然后再用JsonConvert.DeserializeObject转为类来解析, 当json比较复杂时, 创建类也比较浪费时间, VS2022为C#提供了json转C#类的工具,先复制需要转为类的json字符串,然后将光标定位到cs文件的空白处,最后点击编辑–选择性粘贴–将Json粘贴为类,如下图:
在这里插入图片描述
此时即可生成对应的json类,例如下面这个json串:

{
    "statusCode": 200,
    "headers": {
        "Content-Type": "application/json"
    },
    "body": {
        "message": "Success",
        "data": {}
    }
}

自动生成的C#类:

public class Rootobject
{
    public int statusCode { get; set; }
    public Headers headers { get; set; }
    public Body body { get; set; }
}

public class Headers
{
    public string ContentType { get; set; }
}

public class Body
{
    public string message { get; set; }
    public Data data { get; set; }
}

public class Data
{
}

除了VS自带的工具,也有一些网站提供了类似的功能,例如Json2CSharp

当然网上也有已经实现的json转C#类的html工具,下面提供一个自动生成C# json类的工具, html如下:

<html>
<head>
<title>json生成c#类</title>
<link rel="stylesheet" href="http://js.chahuo.com/prettify/prettify.css">
<script language="javascript" type="text/javascript" src="http://js.chahuo.com/prettify/prettify.js"></script>
<script type="text/javascript" src="http://tool.oschina.net/js/jsbeautify.js"></script>
</head>
<body>
	
	<h1>json生成C#类小工具</h1>
	<h5>JSON 字符串</h5>
	<div>
		<textarea style="width:600px;height:300px;margin-bottom:5px;" id="jsonStr"></textarea>
		<br>
		<button onclick="document.getElementById('jsonStr').value='';document.getElementById('class').innerHTML=''">清除</button>
		<button onclick="do_js_beautify()">格式化代码</button>
		<button onclick="startGen()">生成C#类</button>
	</div>

	<h5>C#类代码&nbsp;<button onclick="selectCode()">选中代码</button></h5>
	
	<pre class="prettyprint" id="class" style="border:1px solid #ccc; padding:10px; width:800px;"> 
			
	</pre>
	
	<script>
	
		String.prototype.format = function(){
			var args = arguments;
			return this.replace(/\{(\d+)\}/g,                
				function(m,i){
					return args[i];
			});
		}
		
		String.prototype.trim=function(){
			 return this.replace(/(^\s*)|(\s*$)/g,"");
		}
		
		JSON2CSharp={
			_allClass:[],
			_genClassCode:function(obj,name){
				var clas="public class {0}\r\n{\r\n".format(name || "Root");
				for(var n in obj){
					var v = obj[n];
					n = n.trim();
					clas += "    {0}    public {1} {2} { get; set; }\r\n\r\n".format(this._genComment(v),this._genTypeByProp(n,v),n);
				}
				clas += "}\r\n\r\n";
				this._allClass.push(clas);
				return this._allClass.join("\r\n\r\n");
			},
			_genTypeByProp:function(name,val){
				switch(Object.prototype.toString.apply(val)){
					case "[object Number]" :{
						return val.toString().indexOf(".") > -1 ? "double" : "int";
					}
					case "[object Date]":{
						return "DateTime";
					}
					case "[object Object]":{
                                                name =  name.substring(0,1).toUpperCase() + name.substring(1);
						this._genClassCode(val,name);
						return name;
					}
					case "[object Array]":{
						return "List&#60;{0}&#62;".format(this._genTypeByProp(name+"Item",val[0]));
					}
					default:{
						return "string";
					}
				}	
			},
			_genComment:function(val){
				var commm= typeof(val) == "string" && /.*[\u4e00-\u9fa5]+.*$/.test(val) ? val : "" ;
				return "/// &#60;summary&#62;\r\n    /// "+commm+ "\r\n    /// &#60;/summary&#62;\r\n";
			},
			convert:function(jsonObj){
				this._allClass=[];
				return this._genClassCode(jsonObj);
			}
		}
		
		
		
		function do_js_beautify() {
			var js_source =document.getElementById("jsonStr").value.replace(/^\s+/, '');
			if(js_source.length==0)
				return;
			tabchar = ' ';
			var fjs = js_beautify(js_source);
			document.getElementById("jsonStr").value=fjs;
		}

		
		function startGen(){
			try{
				var v = eval("("+document.getElementById("jsonStr").value+")");
				document.getElementById("class").className ="prettyprint";
				document.getElementById("class").innerHTML=JSON2CSharp.convert(v);
				prettyPrint();	
				document.getElementById("jsonStr").focus();
			}catch(e){
				alert(e.message);
			}
		}
		
		function selectCode() {
			if (document.selection) {
				var range = document.body.createTextRange();
				range.moveToElementText(document.getElementById('class'));
				range.select();
			} else if (window.getSelection) {
				var range = document.createRange();
				range.selectNode(document.getElementById('class'));
				window.getSelection().addRange(range);
			}
		}
	</script>
</body>
</html>

  打开该html, 如下所示:
在这里插入图片描述

复制json字符串, 然后生成json类, 例如要解析的json如下:

{
    "name": "John",
    "age": 30,
    "address": {
        "city": "New York",
        "country": "USA"
    },
    "hobbies": ["reading", "traveling", "sports"]
}

自动生成的json类如下:

public class Address
{
    /// <summary>
    /// 
    /// </summary>
    public string city { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public string country { get; set; }

}



public class Root
{
    /// <summary>
    /// 
    /// </summary>
    public string name { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public int age { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public Address address { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public List<string> hobbies { get; set; }
}

  生成的类数据类型可能和json的不一致, 需要手动检查, 修改, 防止json解析时出错,生成的Json类名是Root, 可以自己修改为想要的类名。

  此时的json解析方法如下:

// 解析JSON
var person = JsonConvert.DeserializeObject<CStudentInfo>(json);

// 获取属性值
string name = person.name;
int age = person.age;
Address address = person.address;
List<string> hobbies = person.hobbies;

生成json字符串

  在进行http请求时, 经常需要传json参数, 对于简单的json字符串, 可以使用string反斜杠来表示, 但是如果json比较复杂或者需要传入参数, 那么将比较复杂,。Newtonsoft.Json也可以生成json字符串. 可以先将要生成的json字符串模板复制到上面的html页面,生成C#类, 例如生成的的json类如下:

internal class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}

  在Main函数中创建Person对象, 然后将其转为json字符串, 代码如下:

static void Main(string[] args)
{
    // 创建一个Person对象
    var person = new Person();
    person.Name = "John";
    person.Age = 30;
    person.City = "New York";
    
    // 将Person对象转换为JSON字符串
    string json = JsonConvert.SerializeObject(person);

    // 输出结果
    Console.WriteLine(json);
}

  对于复杂json, 使用类序列化将是很方便的方法。
对于以上方法,建议使用VS自带的json转C#类工具,转成之后,检查数据类型是否正确,防止在json解析时crash。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用C# Newtonsoft Json通过json数据,解码json生成用于保存数据类json类,通过json生成类代码,支持子类 自动 如 [{"itemsize":437,"pageId":1,"erpNickShopObj":null,"itemjbxx":[{"num":94628,"numIid":40239293981,"outerId":"异常1元连接","picUrl":"http://img04.taobaocdn.com/bao/uploaded/i4/TB1rdpFGXXXXXc5XFXXXXXXXXXX_!!1-item_pic.gif","price":"1.00","title":"[Enni.kr]<恩妮韩品>补邮费/订单异常关闭专拍连接","volume":0},{"num":65592,"numIid":36048181106,"outerId":"爱茉莉沐浴露套装200ml*3","picUrl":"http://img03.taobaocdn.com/bao/uploaded/i3/516137599/TB21kzXXVXXXXcUXXXXXXXXXXXX_!!516137599.jpg","price":"52.00","title":"韩国进口爱茉莉happybath 沐浴露 柠檬 玫瑰 薰衣草 200ml*3套装","volume":0},{"num":59765,"numIid":38272119734,"outerId":"7难题牙膏 绿款","picUrl":"http://img01.taobaocdn.com/bao/uploaded/i1/516137599/TB2xDbXXVXXXXbbXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国进口LG贝瑞奥/倍瑞奥7难题解决牙膏7功能合一强健120G绿色","volume":0},{"num":59764,"numIid":38288409657,"outerId":"黄金皂2件套礼盒","picUrl":"http://img04.taobaocdn.com/bao/uploaded/i4/516137599/TB2XBbXXVXXXXbKXXXXXXXXXXXX_!!516137599.jpg","price":"90.00","title":"包邮 韩国纯金皂 24K金美容皂 天然特效美容黄金皂 2件套装 礼盒","volume":0},{"num":59763,"numIid":38272395230,"outerId":"7难题牙膏 蓝款","picUrl":"http://img02.taobaocdn.com/bao/uploaded/i2/516137599/TB204vXXVXXXXa5XpXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国LG 贝瑞奥/倍瑞奥7难题解决牙膏 7功能合一 原味 120G 蓝色","volume":0},{"num":59758,"numIid":38278150798,"outerId":"9928牙膏绿色款","picUrl":"http://img03.taobaocdn.com/bao/uploaded/i3/516137599/TB2KDDXXVXXXXaEXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国 LG贝瑞奥/倍瑞奥9928牙膏 强齿美白牙膏 120G 绿色","volume":0},{"num":59751,"numIid":38288605749,"outerId":"9928牙膏蓝色款","picUrl":"http://img04.taobaocdn.com/bao/uploaded/i4/516137599/TB2n9HXXVXXXXbxXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国 LG 倍瑞奥 9928 牙膏 抗菌 牙龈护理 防蛀牙固定牙齿 120g","volume":0},{"num":59741,"numIid":38301128090,"outerId":"9928牙膏红色款","picUrl":"http://img01.taobaocdn.com/bao/uploaded/i1/516137599/TB2PATXXVXXXXcHXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国 LG贝瑞奥/倍瑞奥9928牙膏 消炎

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

令狐掌门

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

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

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

打赏作者

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

抵扣说明:

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

余额充值