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

如何基于JObject参数将JSON中单个对象转换为.NET对象?

问题描述

我定义了如下MyDate类:

class MyDate
{
    int year, month, day;
}

现有如下JSON字符串,我希望仅将其中的"dateOfBirth"部分转换为MyDate类的对象:

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

我了解JsonConvert.DeserializeObject<>()方法,但需要一种仅转换JSON字符串中单个对象的方式,且希望使用以JObject作为参数的反序列化方法。


解决方案

核心思路

先把整个JSON解析为JObject,精准定位到dateOfBirth节点后,再将该节点直接反序列化为MyDate对象。另外注意:你的MyDate类字段是私有,Json.NET无法直接访问,需要调整字段可见性或添加特性标记。

完整实现代码

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

class MyDate
{
    // 私有字段需添加JsonProperty特性让Json.NET识别,或者直接改为public
    [JsonProperty]
    int year, month, day;

    // 可选:重写ToString方便查看结果
    public override string ToString()
    {
        return $"{year}-{month}-{day}";
    }
}

class Program
{
    static void Main()
    {
        string jsonStr = @"
        {
            ""firstName"":""Markoff"",
            ""lastName"":""Chaney"",
            ""dateOfBirth"":
            {
                ""year"":""1901"",
                ""month"":""4"",
                ""day"":""30""
            }
        }";

        // 1. 解析整个JSON为JObject
        JObject rootObj = JObject.Parse(jsonStr);

        // 2. 提取dateOfBirth节点并反序列化(推荐用ToObject<T>,直接基于JToken操作)
        MyDate dateOfBirth = rootObj["dateOfBirth"].ToObject<MyDate>();
        
        Console.WriteLine(dateOfBirth); // 输出:1901-4-30
    }
}

关键说明

  • JToken.ToObject<T>()是最贴合需求的方式:直接基于JObject的子节点(JToken)完成反序列化,不需要额外转换为字符串。
  • 字段访问权限:如果不想把MyDate的字段改成public,必须给私有字段加上[JsonProperty]特性,否则Json.NET无法赋值。

内容的提问来源于stack exchange,提问作者Pippen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:50:41