如何仅将缩进序列化应用于某些属性?

2024-04-21

我想以人类可读的方式将 .NET 对象序列化为 JSON,但我希望对对象的属性或数组的元素是否最终位于自己的一行上有更多的控制。

目前我正在使用 JSON.NETJsonConvert.SerializeObject(object, Formatting, JsonSerializerSettings)序列化的方法,但似乎我只能应用Formatting.Indented(各行上的所有元素)或Formatting.None(所有内容都在一行上,没有任何空格)整个对象的全局格式化规则。有没有一种方法可以默认全局使用缩进,但对某些类或属性关闭它,例如使用属性或其他参数?

为了帮助您理解问题,这里有一些输出示例。使用Formatting.None:

{"array":["element 1","element 2","element 3"],"object":{"property1":"value1","property2":"value2"}}

Using Formatting.Indented:

{
  "array": [
    "element 1",
    "element 2",
    "element 3"
  ],
  "object": {
    "property1": "value1",
    "property2":"value2"
  }
}

我想看到的是:

{
  "array": ["element 1","element 2","element 3"],
  "object": {"property1":"value1","property2":"value2"}
}

(我意识到我的问题可能与this one https://stackoverflow.com/questions/9357582/how-to-format-listlistint-as-a-table-in-json-file,但那里的评论完全没有抓住重点,实际上并没有提供有效的答案。)


一种可能性是为需要特殊处理的特定类型编写自定义 Json 转换器并切换它们的格式:

class Program
{
    static void Main()
    {
        var root = new Root
        {
            Array = new[] { "element 1", "element 2", "element 3" },
            Object = new Obj
            {
                Property1 = "value1",
                Property2 = "value2",
            },
        };
        var settings = new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        };
        settings.Converters.Add(new MyConverter());

        string json = JsonConvert.SerializeObject(root, settings);
        Console.WriteLine(json);
    }
}

public class Root
{
    public string[] Array { get; set; }
    public Obj Object { get; set; }
}

public class Obj
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

class MyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string[]) || objectType == typeof(Obj);
    }

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue(JsonConvert.SerializeObject(value, Formatting.None));
    }
}

这将输出:

{
  "Array": ["element 1","element 2","element 3"],
  "Object": {"Property1":"value1","Property2":"value2"}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅将缩进序列化应用于某些属性? 的相关文章

随机推荐

  • OCR 扑克牌 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我决定做一个有趣的项目 我想将扑克牌的图像作为输入并返回其等级和花色 我认为我只需要查看左上角 因为那里包含了所有信息 它应该是稳健的
  • python中的递归图

    我正在尝试按照我的要求对时间序列中的模式进行聚类 如何用python对音节类型进行聚类 https stackoverflow com questions 33393388 how to clustering syllable types
  • linux脚本杀死java进程

    我想要linux脚本来杀死在控制台上运行的java程序 以下是作为 jar 运行的进程 rapp s1 dlap0 ps ef grep java rapp 9473 1 0 15 03 pts 1 00 00 15 java jar ws
  • Ruby on Rails:如何将占位符文本添加到 f.text_field?

    我怎样才能添加placeholder发短信给我的f text field字段 以便默认情况下预先编写文本 并且当用户在字段内单击时 文本会消失 允许用户输入新文本 对于 Rails gt 3 0 您可以简单地使用placeholder op
  • .gitignore 和 Visual Studio 项目:忽略 bin/Debug 目录,但不忽略 bin/Release 目录

    我在 git 存储库中有一个 C Visual Studio 项目 我想忽略内容bin Debug目录 但不是目录的内容bin Release 目录 我已经添加bin Debug to my gitignore文件 但它似乎不起作用 它包括
  • 谷歌浏览器缓存

    我有一个嵌入 flash flex 应用程序的 html 页面 我有以下标题 此外 每次发布应用程序的新版本时 我都会更改文件名 因此 它变得类似于 MyApp v1 swf 然后更新为 MyApp v2 swf 尽管如此 chrome仍然
  • 使用当前 HTTP 请求身份作为 SharpSVN 的默认凭据

    我正在尝试通过 Web 应用程序调用 SharpSVN 中的 RemoteCreateDirectories 并希望凭据是已登录用户的凭据 这可以隐式完成还是需要用户名和密码 如下例所示 using var svnClient new Sv
  • MySQL 中可以将一个别名除以另一个别名吗?

    我有一个多表查询 与此类似 简化版 SELECT columns count table2 rev id As rev count sum table2 rev rating As sum rev rating FROM table1 LE
  • D3.js 如何将我的真实数据合并到饼图中

    我是 D3 和数据可视化的新手 在加载真实数据时遇到一些问题 您将在以下部分中找到我的代码 现在我有一些数据存储在数组中 现在我想做的是将数据库中的实际数据存储到饼图中 另外 如果我这样做 var mydata d3 json mydata
  • 如何在Anaconda Python(Windows平台)中安装xgboost?

    我是一个 Python 新用户 我从以下链接下载了最新的 Anaconda 3 2 4 1 Python 3 5 https www continuum io downloads https www continuum io downloa
  • MySQL选择结果保存到C#变量中

    你能检查我的代码并回答我如何将 mysql 选择结果保存到 C 字符串中吗 try MySqlDataReader reader null string selectCmd SELECT FROM TabelaUtilizatori MyS
  • ReactiveCommand 传递命令参数

    我想用命令来实现文本框中的KeyDown事件 我想让命令能够识别哪个键输入 例如 KeyEventArgs 在 KeyDown Event 中执行操作并执行其他一些操作 所以我想将命令参数传递给ReactiveCommand 就像Event
  • Python selenium:DevTools 监听 ws://127.0.0.1

    今天 当我使用 chromedriver 运行 selenium 时 我在控制台上收到此消息 我该如何抑制这种情况 DevTools listening on ws 127 0 0 1 12740 devtools browser 9710
  • 更改 Integration Services 项目中的 .NET Framework

    在 Visual Studio 2013 中创建新的 Integration Services 项目时 我可以选择要定位的 NET 框架 如何查看现有项目所针对的 NET 框架并可能对其进行更改 您需要打开脚本任务之一并单击 编辑脚本 按钮
  • 如何在 R 中按下传单弹出窗口时创建事件?

    当我单击传单多边形时 我想让 tabPanel 变为闪亮 我对如何做到这一点有一些想法 但我找不到实现它们所需的信息 我在选项卡面板中有传单 但我想在单击多边形时切换到另一个选项卡 leaflet llmap gt addTiles gt
  • 使用 cmake 构建项目后如何运行 ctest

    我希望每次成功构建项目时都启动测试 如果某些测试被破坏 我希望我的构建也被破坏 默认情况下 我需要通过运行来手动运行测试ctest命令 CTest 实际上可以构建项目 但我使用调用的 IDEmake建立资源 和make不运行测试 我将此命令
  • php 7 无法初始化 sqlsrv

    我搜索了一整天 寻找 php 7 VC14 x64 Thread Safe 上 sqlsrv dll 的解决方案 但没有找到解决方案 有没有人解决这个问题 04 Oct 2015 19 48 05 UTC PHP Warning PHP S
  • UNNotificationServiceExtension:内存限制?

    我正在尝试实现 UNNotificationServiceExtension 但我的代码似乎经常失败 只需说明 Program ended with exit code 0 我正在尝试在扩展中使用 FMDB Sqlite3 模块 似乎我可能
  • 诊断 SQL Server 2005 中的死锁

    我们在 Stack Overflow SQL Server 2005 数据库中发现了一些有害但罕见的死锁情况 我附加了分析器 使用设置了跟踪配置文件这篇关于解决死锁问题的优秀文章 http www simple talk com sql l
  • 如何仅将缩进序列化应用于某些属性?

    我想以人类可读的方式将 NET 对象序列化为 JSON 但我希望对对象的属性或数组的元素是否最终位于自己的一行上有更多的控制 目前我正在使用 JSON NETJsonConvert SerializeObject object Format