Json.NET,可以扩展SerializeXmlNode来检测数字吗?

2023-12-06

我正在使用以下方法从 XML 转换为 JSONSerializeXmlNode。看起来预期的行为是将所有 XML 值转换为字符串,但我想在适当的情况下发出真实的数值。

// Input:   <Type>1</Type>
string json = JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.Indented, true);
// Output:  "Type": "1"
// Desired: "Type": 1

我是否需要编写一个自定义转换器来执行此操作,或者是否有一种方法可以通过委托在适当的点挂钩到序列化过程?或者,我必须写自己的习惯JsonConverter类来管理转换?

正则表达式黑客

考虑到正确解决方案的复杂性,这是另一个(我并不完全为此感到自豪,但它有效......)。

// Convert to JSON, and remove quotes around numbers
string json = JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.Indented, true);

// HACK to force integers as numbers, not strings.
Regex rgx = new Regex("\"(\\d+)\"");
json = rgx.Replace(json, "$1");

XML 没有像 JSON 那样区分原始类型的方法。因此,当将 XML 直接转换为 JSON 时,Json.Net 不知道值应该是什么类型,无法猜测。如果它始终假设仅由数字组成的值是序数,那么邮政编码和带有前导零的电话号码等内容将在转换中受到破坏。因此,Json.Net 采取安全道路并将所有值视为字符串也就不足为奇了。

解决此问题的一种方法是将 XML 反序列化为中间对象,然后将其序列化为 JSON。由于中间对象具有强类型属性,Json.Net 知道要输出什么。这是一个例子:

class Program
{
    static void Main(string[] args)
    {
        string xml = @"<root><ordinal>1</ordinal><postal>02345</postal></root>";

        XmlSerializer xs = new XmlSerializer(typeof(Intermediary));
        using (TextReader reader = new StringReader(xml))
        {
            Intermediary obj = (Intermediary)xs.Deserialize(reader);
            string json = JsonConvert.SerializeObject(obj , Formatting.Indented);
            Console.WriteLine(json);
        }
    }
}

[XmlRoot("root")]
public class Intermediary
{
    public int ordinal { get; set; }
    public string postal { get; set; }
}

上面的输出:

{
  "ordinal": 1,
  "postal": "02345"
}

是的,为了制定更通用的解决方案,您必须编写自己的转换器。事实上,调用时发生的 XML 到 JSON 转换SerializeXmlNode是使用一个完成的XmlNodeConverter随 Json.Net 一起提供。这个转换器本身似乎不太可扩展,但你总是可以使用它源代码作为创建自己的起点。

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

Json.NET,可以扩展SerializeXmlNode来检测数字吗? 的相关文章

随机推荐

  • plm 与 lm - 结果不同?

    我多次尝试使用 lm 和 plm 进行回归 我得到了不同的结果 首先 我使用 lm 如下 fixed Region1 lt lm CapNormChange Policychanges factor Region data Panel 此外
  • Java中的静态块未执行

    class Test public static void main String arg System out println MAIN METHOD System out println Mno VAL SOP 9090 System
  • WPF。将列表框 itemtemplate 内部绑定到 ObservableCollection 源。源 PropertyChanged 被忽略

    我正在尝试创建一个显示格式化文本的列表框 我希望能够更改代码的格式 为了显示格式化文本 我选择了 TextBlock 并打算使用 TextBlock Inlines 集合进行格式化 TextBlock Inlines 不可绑定 所以我创建了
  • 使用 jQuery 验证 addMethod 设置输入文本的日期格式 dd.mm.yyyy

    我在使用这个 addMethod 来验证输入的日期时遇到了真正的麻烦 它没有正确测试正则表达式 我认为它可能写有错误 日期应采用以下格式 dd mm yyyy 请帮忙 function msgBtn click function var i
  • 动态创建一组 SQLAlchemy 表

    我有一个用 SQLAlchemy 声明定义的简单表 Base declarative base class MyTable Base tablename mytable1 row id Column INT primary key True
  • C++:复制数组

    是否可以在 C 中做这样的事情 现在无法自己测试 int myarray 10 111 222 333 444 555 666 777 888 999 1234 void functioncc int temparray myarray f
  • Windows 安装程序 (wix) 安装产品两次

    我使用 WIX 安装测试产品 使用默认的 wix 设置非常简单 如果我设置产品 id 安装 重建并再次安装 我的程序列表中有两个产品 为什么 我的产品
  • javafx argb 到灰度转换

    我知道有类似的问题 但这些问题并没有回答我的问题 正如标题所示 我正在使用 JavaFXImage类 而不是 bufferedImage 我用了答案this其他问题 但生成的图像是空的 这是我的代码 public static Image
  • Powershell监控多个目录

    注意 运行 PowerShell v3 我目前的目录设置是 ftproot 001 converted ftproot 001 inbound ftproot 001 pdf ftproot 002 converted ftproot 00
  • 使用函数依赖的关联参数限制

    对于给定类型 a 下面的函数 f 采用类型 c 的参数 对于不同类型的 a c 以不同的方式受到限制 具体来说 当 a 是任何整数类型时 c 应该允许是任何 实数 类型 当 a 为 Float 时 c 只能为 Float 一种尝试是 LAN
  • Websphere:web.xml 中的安全约束不起作用

    我想保护单个 jsp 页面免遭匿名访问 我正在尝试通过以下方式做到这一点
  • 有符号整型和无符号整型有什么区别

    有符号整型和无符号整型有什么区别 您可能知道 ints 在内部以二进制形式存储 通常是一个int包含 32 位 但在某些环境中可能包含 16 或 64 位 甚至不同的数字 通常但不一定是 2 的幂 但对于这个例子 我们来看 4 位整数 虽然
  • C# 7 模式匹配语义

    我有两个我认为是相等的代码块 First the if based block 然后完全相同 但转换为切换大小写类型 很抱歉 Resharper 红色波浪标记不好 Resharper 还不明白这一点 基于开关的代码将在第一个时抛出空引用异常
  • Spark 中的 DataFrame orderBy 后跟 limit

    我有一个程序生成一个 DataFrame 它将在其上运行类似的东西 Select Col1 Col2 orderBy ColX limit N 但是 当我最终收集数据时 我发现如果我采用足够大的前 N 个 则会导致驱动程序 OOM 另外另一
  • 从 Outlook 中的特定文件夹导入电子邮件

    我目前正在 Excel 中使用以下代码来访问无人值守的 Outlook 邮箱中的文件夹 而不是我自己的邮箱 但是 有没有一种方法可以在代码中设置文件夹 而不是使用文件夹选择器 Sub Launch Pad Dim olApp As Outl
  • 有没有办法从 GET 请求中删除提交按钮?

    我有一个可以查看的页面photos each photo是在一个album 在页面顶部我有一个albums选择框album id and album name分别
  • CORS 策略已阻止我的子域

    我有一个相同的域 其中一个是没有前缀 www 的域 例如 https www example com https example com 第一个域工作正常 因为它是默认域 但当我执行 CRUD 或访问任何 api 服务时 第二个出现错误 访
  • 无法预览此文件,应用程序可能已崩溃 -- 输入特定代码行时发生

    虽然我在堆栈溢出上四处寻找答案 但感觉我的情况对于这个错误来说是独一无二的 我一直在学习如何在 SwiftUI 中使用 CoreData 来保存持久数据 我首先制作一个基本的电影列表 当您单击 添加电影 按钮时 它会添加带有一些任意文本的电
  • Python:使用 numpy 或 scipy 读取 Fortran 二进制文件

    我正在尝试读取一个 fortran 文件 其标题为整数 然后实际数据为 32 位浮点数 使用 numpy 的fromfile mydatafile dtype np float32 它以 float32 形式读取整个文件 但我需要输出文件的
  • Json.NET,可以扩展SerializeXmlNode来检测数字吗?

    我正在使用以下方法从 XML 转换为 JSONSerializeXmlNode 看起来预期的行为是将所有 XML 值转换为字符串 但我想在适当的情况下发出真实的数值 Input