【问题标题】:Create JObject with propertyname.subname使用 propertyname.subname 创建 JObject
【发布时间】:2018-10-05 10:31:47
【问题描述】:

我正在尝试动态创建一个 JObject 用于单元测试,但它似乎不喜欢 name.subname 作为属性

我试图为其创建 JObject 的 json 是

   { "UserDetails": {
          "FirstName": "Test1",
          "Surname": "Test2",
          "UserID": "123456789",
          "Children1.Active1": false,
          "Children1.Active2": false
    }
}

我的 C# 代码是

dynamic jsonObject = new JObject();
jsonObject.UserDetails = new JObject();
jsonObject.UserDetails.UserID = "123456789";
jsonObject.UserDetails.FirstName = "Test1";
jsonObject.UserDetails.Surname= "Test2";

但是我不确定如何将 Children1.Active 添加到 JObject jsonObject. UserDetails 它不适用于 jsonObject.UserDetails.Children.Active1 = false

我已经验证了 json 并且它通过了有效 json 的验证。

如何将Children1.Active 添加到JObject?

我试过jsonObject.UserDetails.Children1 = new JObject(); 但这会创建一个新的子对象,这不是我需要的。

【问题讨论】:

  • 听起来像Children1 需要是一个数组或对象本身。这不是一个好的 JSON 模式。至于问题本身,而不是尝试将JObject 作为动态对象访问,而是使用它自己的属性并设置属性和键。在 this 代码中你不需要dynamic - 将UserDetails 对象存储在一个单独的变量中,你不需要通过jsonObject 访问它

标签: c# json json.net


【解决方案1】:

"Children1.Active2" 不是嵌套对象,它是名称字符串中带有句点的属性。而且由于您是通过dynamic 进行所有操作,因此这很麻烦,因为即使 JSON 属性名称可以,c# 标识符也不能包含这样的字符。

在这种情况下,与其使用dynamic,不如使用类型化的JObject 及其编译时绑定方法,特别是string indexer 方法更容易:

var jsonObject = new JObject();
var userDetails = new JObject();
jsonObject["UserDetails"] = userDetails;
userDetails["UserID"] = "123456789";
userDetails["FirstName"] = "Test1";
userDetails["Surname"] = "Test2";           
userDetails["Children1.Active1"] = false;
userDetails["Children1.Active2"] = false;

这也应该更高效,因为dynamic 可以有一些run-time performance penalties

小提琴样本here.

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多