在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#类代码 <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<{0}>".format(this._genTypeByProp(name+"Item",val[0]));
}
default:{
return "string";
}
}
},
_genComment:function(val){
var commm= typeof(val) == "string" && /.*[\u4e00-\u9fa5]+.*$/.test(val) ? val : "" ;
return "/// <summary>\r\n /// "+commm+ "\r\n /// </summary>\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字符串, 代码如下:文章来源:https://www.toymoban.com/news/detail-481649.html
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。文章来源地址https://www.toymoban.com/news/detail-481649.html
到了这里,关于C# json生成类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!