c# Json解析类型没有创建类如何解析字段
时间: 2025-04-02 22:17:50 浏览: 40
在 C# 中,如果需要解析 JSON 数据但又不想提前创建对应的类结构(例如实体模型),可以利用 `dynamic` 类型、匿名对象或基于字典的方式来进行操作。
以下是几种常见的解决办法:
---
### **方法一:使用 `JObject` 或者 `JsonDocument`**
通过 NewtonSoft.Json 库提供的 `JObject` 来动态读取数据内容:
```csharp
using Newtonsoft.Json.Linq;
string json = "{\"name\":\"张三\",\"age\":25}";
JObject jObj = JObject.Parse(json);
// 动态访问属性值
string name = (string)jObj["name"];
int age = (int)jObj["age"];
Console.WriteLine($"Name: {name}, Age: {age}");
```
或者直接遍历整个 JSON 结构:
```csharp
foreach (var item in jObj)
{
Console.WriteLine($"{item.Key}: {item.Value}");
}
```
这种方式无需事先定义具体的类类型即可完成对 JSON 的解析。
---
### **方法二:借助 `ExpandoObject` 和 Dynamic 关键词**
也可以采用 .NET 自带的 `System.Dynamic.ExpandoObject` ,将它当作 Dictionary 使用,并结合 dynamic 完成非强类型的访问需求示例如下所示:
```csharp
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Text.Json;
public static ExpandoObject ParseToExpando(string jsonString)
{
var expando = new ExpandoObject() as IDictionary<string, object>;
using(var doc = JsonDocument.Parse(jsonString))
{
foreach(var property in doc.RootElement.EnumerateObject())
expando[property.Name] = GetPropertyValue(property.Value);
}
return expando;
}
private static object GetPropertyValue(JsonElement value)
{
switch(value.ValueKind){
case JsonValueKind.Object:
//递归处理嵌套的对象
return ParseToExpando(value.ToString());
case JsonValueKind.Array:
//处理数组情况下的元素转换
return value.EnumerateArray().Select(GetPropertyValue).ToList();
default://基础类型如字符串数字等则返回其原始值
return value.GetRawText();
}
}
static void Main()
{
string jsonData=@"{'Person':{'FirstName':'John','LastName':'Smith'}, 'Age':40}";
dynamic personInfo=ParseToExpando(jsonData);
Console.WriteLine(personInfo.Person.FirstName); //"John"
}
```
上面展示了从简单到复杂包括嵌套字段以及列表在内的全面支持方案。其中核心在于自定义了一个辅助函数用于判断不同类型的数据节点再做相应地转化工作最终使得我们可以像操纵普通对象那样轻松获取任意层级的信息而不用关心底层实际存储形式是什么样的。
---
### **总结**
当不确定JSON的具体格式或者是临时性任务时上述提到的技术都非常有用;但如果经常需要用到某个特定模式下的序列化反序列化进程的话还是推荐预先建立好相应的POCO(Plain Old CLR Object),以便于提高程序运行效率同时增强代码可维护性和健壮程度!
阅读全文
相关推荐



















