You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:37:03