【问题标题】:C# how to add a json opening brace and closing brace to an ExpandoObject?C#如何将json左大括号和右大括号添加到ExpandoObject?
【发布时间】:2021-02-26 00:00:53
【问题描述】:

如何将 prop1 和 prop2 从 json 转换为 ExpandoObject 语法?他们有一个开始 { 和结束 },我不知道如何在 ExpandoObject 语法中表示它。

{
  "prop1": {
    "prop2": {
      "prop3": "value3",
      "prop4": "value4"
    }
}

}

// I need to convert the json to something like this
// but cannot figure out the syntax
// to get it to generate json correctly to look like the above


dynamic form = new ExpandoObject();


form.prop1 = "{"; // how do I add the {
form.prop2 = "{";  // how do I add the {
form.prop3 = "value3";
form.prop4 = "value4";
form.prop2 = "}"; // how to I add the close }
form.prop1 = "}"; // how do I add the closing }


// this string should look like the above json 
// but I cannot figure out the ExpandoObject syntax for the braces
string Json = JsonConvert.SerializeObject(form);

【问题讨论】:

  • 您需要发布一个简短的问题,说明您对事情的期望。
  • 抱歉,我添加了更多信息。感谢您的关注。
  • 您发布的 JSON 不正确。为什么不使用类对象来生成 JSON?描述您实际尝试完成的工作可能比要求修补您自己的问题解决方案更好。
  • 感谢您的反馈。我已经修复了 json 语法。我有一个需要动态构建的自定义 json 模式。直接将类属性转换为 json 将不符合 json 架构要求。我正在使用自定义属性来跳过属性,将属性名称添加到架构中所需的 json 部分,将属性标记为可选,以便它们不包含在 json 架构中,等等。不幸的是,这就是我推出自己的产品的原因。因此,在我的 C# 类中,我拥有带有自定义属性的属性,这些属性推动了 json 模式的创建。

标签: c# json dynamic


【解决方案1】:

我认为您必须先了解 ExpandoObject 的工作原理,然后才能开始添加大括号或方括号。

Documentation on ExpandoObject and how to add members

阅读完文档后,您会发现以下示例很有帮助。基本上,ExpandoObject 是包含动态属性的对象的表示。 { } 代表一个对象,[ ] 代表一个数组等等。

如果您想从您的问题中创建 JSON 对象,以下是您如何通过 ExpandoObject 完成它。

// Create the object prop2
dynamic prop2 = new ExpandoObject();
prop2.prop3 = "value3";
prop2.prop4 = "value4";
/*
    {
      "prop3": "value3",
      "prop4": "value4"
    }
*/

dynamic prop1 = new ExpandoObject();
prop1.prop2 = prop2;
/*
  {
    "prop2": {
      {
        "prop3": "value3",
        "prop4": "value4"
      }
    }
  }
*/

dynamic root = new ExpandoObject();
root.prop1 = prop1;
/*
  {
    "prop1": {
      "prop2": {
        {
          "prop3": "value3",
          "prop4": "value4"
        }
      }
    }
  }
*/

在这个例子中,你正在做的是,

  1. 创建一个“对象”,其中包含 prop3 和 prop4 作为属性/键,其值分别为“value3”和“value4”。
  2. 将对象从 1. 分配给另一个对象 prop1 作为“prop2”
  3. 将 2 中的整个对象分配给名为 root 的新对象,该对象将 2 中的对象作为“prop1”属性的值。

以下是更短的方法,

dynamic root = new ExpandoObject();
root.prop1 = new ExpandoObject(); // means prop1 is an object.
root.prop1.prop2 = new ExpandoObject(); // means prop2 is an object
root.prop1.prop2.prop3 = "value3"; // assigns value3 to property prop3
root.prop1.prop2.prop4 = "value4"; // assigns value4 to property prop4

【讨论】:

  • 感谢您的解释!我现在明白,通过执行 prop1.prop2 = new ExpandoObject() 创建大括号,然后我可以将子属性添加到 prop2 等等。再次感谢您抽出宝贵时间回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2017-04-20
  • 2016-08-26
  • 2019-02-03
相关资源
最近更新 更多