我可以将 json 解析为字符串或其他具体类型作为对象吗?

2023-12-04

我想要拥有 type 的财产object这可以是string or Template type.

是否可以告诉 Json.NET 将某些内容解析为几种指定类型之一?

class MyClass
{
    public object Template { get; set; }
}

where Template = "TemplateName"

{
    "Template": "TemplateName"
}

or Template = new Template()

{
    "Template": { "Name": "OtherTamplate", ... }
}

UPDATE:

我尝试遵循@krillgar'的建议并创建一个自定义JsonConverter但不幸的是CanConvert方法仅接收目标类型,在本例中object。这些信息不足以判断它是否可以反序列化(如果我有其他object特性)。我想我需要它成为Template毕竟或者创建一个派生类型,例如TemplateReference或者其他的东西:

class myconverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        // objectType = typeof(object)
        throw new NotImplementedException();
    }
}

Configuration = JsonConvert.DeserializeObject<MyClass>(text, new myconverter());

免责声明

这个问题曾经作为重复项被关闭如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性。因为在写我的问题时,我不知道已经有一个类似的问题,我想澄清它们之间的区别,以防止它将来被关闭:

另一个问题是关于如何将不同的值反序列化为concrete类型,而我的是将不同的值反序列化为object。乍一看似乎是相同的,因为在这两个示例中,只有属性的类型不同,但它对整体应用程序设计有巨大的影响。对我来说很重要的是我可以使用object存储不同的专门类型,而不是一种具有多种职责的类型。


这个问题可以通过使用自定义的方法来解决JsonConverter。这是适用于这种情况的通用版本:

class ObjectOrStringConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // CanConvert is not called when the [JsonConverter] attribute is used
        return false;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Object)
        {
            return token.ToObject<T>(serializer);
        }
        return token.ToString();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

要使用转换器,您需要做的就是添加一个[JsonConverter]attribute 是类中的属性,可以是字符串或对象。泛型类型参数必须与您期望的非字符串对象的类型匹配。

class MyClass
{
    [JsonConverter(typeof(ObjectOrStringConverter<Template>))]
    public object Template { get; set; }
}

下面是转换器的实际操作演示:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("--- first run ---");

        string json = @"
        {
            ""Template"": ""TemplateName""
        }";

        DeserializeAndDump(json);

        Console.WriteLine("--- second run ---");

        json = @"
        {
            ""Template"": { ""Name"": ""OtherTemplate"" }
        }";

        DeserializeAndDump(json);
    }

    static void DeserializeAndDump(string json)
    {
        MyClass obj = JsonConvert.DeserializeObject<MyClass>(json);
        if (obj.Template == null)
        {
            Console.WriteLine("Template property is null");
        }
        else
        {
            Console.WriteLine("Template property is a " + obj.Template.GetType().Name);

            string name = "(unknown)";
            if (obj.Template is Template) name = ((Template)obj.Template).Name;
            else if (obj.Template is string) name = (string)obj.Template;

            Console.WriteLine("Template name is \"" + name + "\"");
        }
        Console.WriteLine();
    }
}

class Template
{
    public string Name { get; set; }
}

这是上面的输出:

--- first run ---
Template property is a String
Template name is "TemplateName"

--- second run ---
Template property is a Template
Template name is "OtherTemplate"

Fiddle: https://dotnetfiddle.net/Lw3RaN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将 json 解析为字符串或其他具体类型作为对象吗? 的相关文章

  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • JSON 语法:传输数组

    A validJSON 语法是这样的 username admin password 123 但是如果我想传输一组 用户 给出的例子 而不是单个 用户 根据规范 下面的代码是有效的 JSON 吗 username admin passwor
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 将压缩的json数据存储在本地存储中

    我想将 JSON 数据存储在本地存储中 有时存储的数据可能超过 5MB 每个域的浏览器允许的最大阈值 无论如何 我可以压缩或压缩数据并将其存储在本地存储中吗 如果对大数据进行每个 JS 函数的压缩和解压 会增加多少延迟 我正在使用这个 js
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Google Calendar JSON API:全天活动总是多一天

    Since recently the JSON API always seems to add a day when returning the timespan for full day events Display in Google
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 只返回 $.ajax 传递的 JSON 数据的前 20 个结果?

    我有以下简单的 jquery 片段 document ready function ajax url myjson json dataType json success function json each json function al
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 存储对值类型的引用?

    我正在编写一个 监视器 对象以方便调试我的应用程序 可以在运行时从 IronPython 解释器访问此 Monitor 对象 我的问题是 在 C 中是否可以存储对值类型的引用 假设我有以下课程 class Test public int a
  • 如何在android中以编程方式运行SSH命令

    我想运行一个简单的 SSH 命令 例如ssh R 80 localhost 1337 serveo net 我知道有图书馆jsch这样做 但如果没有用户名和密码 它将无法工作 就我而言 不需要身份验证 我怎样才能做到这一点 Update当我
  • jQuery插件开发-返回this.each问题

    我正在尝试开发我的第一个 jQuery 插件 基本上 它将类附加到站点上的各种元素 然后在用户滚动时更改它 我正在计算偏移量等 我想我在这件事上碰壁了 这是我启动插件的方法 div myPlugin 以及来源 fn myPlugin fun
  • 如何发送由 ON_NOTIFY 处理的通知?

    我正在尝试将 LVN ITEMCHANGED 发布给我的自定义网格列表的所有者 我知道如何使用 PostMessage 发送 WM User 消息 如此处所示 PostMessage AfxGetMainWnd gt GetSafeHwnd
  • 覆盖 DI 范围内的服务实现

    如何使用miscrosoft 的默认 DI 机制在某个范围内注册不同的服务实现 我的情况是这样的 我有一个服务 我们称之为 MyJobService 它依赖于上下文值 登录的用户和其他一些信息 我已经注册了另一个服务 UserSession
  • 为什么我不能画一个有边框半径的圆?

    margin 0 div background color green height 900px width 50 margin auto border radius 50px overflow hidden padding 20px bo
  • 有没有通用的方法可以从矩阵中删除 NaN?

    有没有通用的方法可以从矩阵中删除 NaN 有时我在某些代码中间遇到这个问题 然后它会产生问题以获得适当的输出 有没有办法生成任何类型的检查以避免 MATLAB 代码中出现 NaN 如果有人能给我一个例子并提供一些与之相关的想法 那将非常有帮
  • CURL 问题(多)

    我有问题卷曲 多重 我想创建一个类 函数 它接收 1000 个 URL 并一次处理所有这些 URL 5 因此当 URL 完成下载时 它会将现在可用的插槽分配给尚未处理的新 URL然而 我见过some 实施的curl multi 但它们都不允
  • 打字稿模板文字作为界面键

    假设我想创建一个包含打字稿中多个项目的对象 如下所示 const obj Items item1 foo item2 bar item3 baz 我应该如何声明我的项目类型 以便它与任意数量的项目兼容 我使用 Typescript 4 1
  • 查看哪些 git 分支(或标签)指向给定的提交哈希?

    我可以通过运行达到我想要的效果 git log 1 decorate oneline
  • 如何在.NET (C#) 中本地存储数据[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在编写一个应用程序 它获取用户数据并将其存储在本地以供以后使用 应用程序将经常启动和停止 我想让它在应用程序启动 结束时保存 加载数据 如果我使用平面文件 那就相当简单了 因为数据并不
  • 使用 AWS Glue 将非常大的 csv.gz(每个 30-40 GB)转换为 parquet

    有很多这样的问题 但似乎没有任何帮助 我试图将相当大的 csv gz 文件隐藏到镶木地板上 并不断收到各种错误 例如 Command failed with exit code 1 or An error occurred while ca
  • 无法连接到 Android 上的 React Native 开发服务器

    当我跑步时react native run android 它给了我以下错误 无法连接到开发服务器 包服务器正在运行 我可以直接从浏览器访问它 在我的移动设备上 我的 Android 设备已连接到计算机并启用了调试 我 检查使用adb de
  • Flutter 圆角矩形边框,每边具有不同的颜色

    我正在尝试重新创建一个用 React Native 制作的按钮 它的每一面都有不同的颜色 给人一种轮廓分明的效果 有点像 Photoshop 斜角和浮雕 但也有圆角 目前我在按钮外面有一个容器 上面有边框 在里面我正在使用RawMateri
  • 如何将 SQL Server 2008 Express 添加到先决条件列表

    如何将 SQL Server 2008 Express 添加到 Visual Studio 2008 SP1 MSI 安装程序项目的先决条件列表中 您必须从 MS 下载中心下载 SQL Server 2008 Bootstrapper 我认
  • 在 symfony 2 中自定义日期形式

    我正在尝试使用 symfony2 和 twig 更改 date widget 默认情况下 年份字段有 10 年选项 例如今天日期之前 5 年和之后 5 年 我想要的只是到现在为止的几年 我怎样才能改变它 我已经看过 form div lay
  • 是否有工具可以查询 S3 存储中托管的 Parquet 文件?

    我的 S3 存储桶中有 Parquet 文件 但它不是 AWS S3 是否有一个工具可以连接到任何 S3 服务 例如 Wasabi Digital Ocean MinIO 并允许我查询 Parquet 文件 如果您需要 GUI 工具 那么您
  • 无法使用 apache Drill 在 RDBMS 上查询

    使用apacherill 1 2 我们可以查询RDBMS数据 在这里查看更多信息 https drill apache org blog 2015 10 16 drill 1 2 released 所以 我尝试为MySQL添加一个插件 我正
  • R rfe函数“caret”包错误:x和y中应该有相同数量的样本

    当我尝试从 caret 包中获取 rfe 示例时here 我一直收到这个错误 Error in rfe default d 1 2901 c 1 1 1 1 1 1 2 2 2 3 3 3 there should be the same
  • 我可以将 json 解析为字符串或其他具体类型作为对象吗?

    我想要拥有 type 的财产object这可以是string or Template type 是否可以告诉 Json NET 将某些内容解析为几种指定类型之一 class MyClass public object Template ge