C#中能否将Newtonsoft.Json.Linq.JObject作为参数传递用于JSON解析?
问题解答:动态解析JSON时传递JObject到自定义函数
完全可以将循环中的item传入自定义解析函数,参数类型可以选择JObject或者dynamic,两种方式都能满足你不创建POJO的动态解析需求,以下是具体说明和代码示例:
1. 使用JObject作为参数类型
你的改写思路是可行的,只需注意补充必要的命名空间,并可以优化代码的类型明确性:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.IO; class Program { static void Main() { parseJson(); } static void parseJson() { using (StreamReader r = new StreamReader("Input.json")) { string json = r.ReadToEnd(); // 直接反序列化为JArray,比dynamic更明确 JArray array = JsonConvert.DeserializeObject<JArray>(json); foreach (JObject item in array) { Console.WriteLine("Item Type: {0}", item.GetType()); parseItem(item); } } } static void parseItem(JObject item) { // 两种属性访问方式都支持 Console.WriteLine("ID: {0}", item.ID); Console.WriteLine("Name: {0}", item["Name"]); Console.WriteLine("Age: {0}", item.Age); // 处理嵌套的Emails数组 JArray emails = item["Emails"] as JArray; if (emails != null) { Console.WriteLine("Emails:"); foreach (var email in emails) { Console.WriteLine("- {0}", email.ToString()); } } } }
2. 使用dynamic作为参数类型
如果想保持完全动态的风格,也可以将参数定义为dynamic,和你最初的代码逻辑一致:
using Newtonsoft.Json; using System.IO; class Program { static void Main() { parseJson(); } static void parseJson() { using (StreamReader r = new StreamReader("Input.json")) { string json = r.ReadToEnd(); dynamic array = JsonConvert.DeserializeObject(json); foreach (var item in array) { Console.WriteLine("Item Type: {0}", item.GetType()); parseItem(item); } } } static void parseItem(dynamic item) { Console.WriteLine("ID: {0}", item.ID); Console.WriteLine("Name: {0}", item.Name); Console.WriteLine("Age: {0}", item.Age); // 遍历嵌套数组 Console.WriteLine("Emails:"); foreach (var email in item.Emails) { Console.WriteLine("- {0}", email); } } }
关键注意事项
- 你的输入JSON存在语法错误:
"Name": "abc"和"Age": "1"末尾缺少逗号,Emails数组最后一个元素后的冗余逗号需要删除,修正后的JSON如下:
[ { "ID": "1", "Name": "abc", "Age": "1", "Emails": [ "abc@def.com", "abc123@def.com", "abc@ghi.com" ] } ]
JObject的优势是具备编译时类型检查,能提前发现属性名拼写错误;dynamic更灵活,但错误只会在运行时暴露,可根据需求选择。
内容的提问来源于stack exchange,提问作者SyncMaster
相关产品推荐
相关产品推荐

