【问题标题】:Is this valid JSON? Email address as reference type?这是有效的 JSON 吗?电子邮件地址作为参考类型?
【发布时间】:2021-12-06 16:25:57
【问题描述】:

我正在将我们的系统与第 3 方集成。他们发送了一个他们期望的 JSON 示例。 JSON 对我来说似乎不正确。用户对象有一个电子邮件地址,看起来像是被用作reference type's member name instead of value type's member name。换句话说,它不应该是一个用户数组,并且数组中的每个项目都是用户对象,其中“电子邮件”:“example@company.com”作为属性之一?

我要问他们,但也想在这里查看是否有人认为这个 JSON 有问题

    {
      "users": {
    “example@company.com”:    {
          "First_Name": "John",
          "Last_Name": "Doe",   
          "Member_Id": "XX9008000",
          "Mailing_Address": {
            "Street": "P O Box 111 ",
            "City": "Red City",
            "State": "CA",
            "Zip": "99999"
          }
        },
      "enrollments": [
        {
          "Student": "example@company.com",
          "Course_Ids": "369,370"
        }
      ]
    }
}

我正在使用 Newtonsoft.Json 将 C# 对象转换为 JSON。输出的格式总是引用类型的类型:引用类型的属性/值枚举。

{"users":[{"name":"john","id":"a1"},{"name":"tom","id":"a2"}]}

{"users":{"user1":{"name":"john","id":"a1"},"user2":{"name":"tom","id":"a1"}}}

但它永远不可能:

{"users":{"a1":{"name":"john"},"a2":{"name":"tom"}}}

因为a1和a2是的值类型string Id

它可能是有效的JSON,但可以通过序列化库代码获得吗?还是我必须手动构建它?

【问题讨论】:

  • 使用电子邮件地址作为对象的键在语法上对 JSON 有效。然而,奇怪的是电子邮件地址周围的引号字符。对象末尾还缺少一个右花括号。
  • 除了缺少的“}”,它在语法上似乎是正确的。语义上存在问题。如果键是复数(“用户”),则预期内容是对象数组而不是单个对象。在当前示例中,无法添加多个用户,因此,复数看起来像是一个错误。我敢打赌,一旦你指出这个观察,他们会给你另一个版本
  • 最后缺少的花括号是我的错误。我已经编辑了我的问题。我正在使用 Newtonsoft.Json 将 C# 对象转换为 JSON。输出的格式始终为引用类型名称:引用类型属性/值枚举。电子邮件地址如何按他们想要的方式输出?也就是说,值类型值:引用类型属性/值枚举。除非我手动构建 JSON
  • 您应该将其添加到问题中......和/或联系提供商以验证这是一个有效的示例。我希望用户部分是一个数组,但电子邮件地址可能是顶级...并且enrollments 是否与每个用户或整体相关?我怀疑是整体的,因为否则那里不需要电子邮件地址。
  • 可能是C#的东西,不过不知道你说的“引用类型”和“值类型”是什么意思。

标签: c# arrays json json.net


【解决方案1】:

忽略此处的引用类型(应该是“<..>”)->“example@company.com”,这是一个有效的 JSON,并且是此类对象的常见用途。

结构体不是对象数组,而是对象的 id,在其内部是对象。

您需要一个 Dictionary,其中键可能是用户名(=电子邮件),值是用户对象。

【讨论】:

  • 不知道字典会这样序列化!非常感谢!
【解决方案2】:

第一个问题

不应该是用户数组吗?

这是具有一个或多个元素的不同 json 响应的典型问题。

要生成 Json,最好坚持使用所谓的 Badger-Fish 表示法 http://badgerfish.ning.com/,它指出:

“嵌套元素变为嵌套属性”,但“同一级别的多个元素变为数组元素”,因此当有一个元素时,显示一个属性,但如果有多个元素,则显示一个数组。

由于同一级别只有一个“users”元素和一个“enrollments”元素,因此不应声明任何数组。

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 2011-03-28
    • 2013-11-20
    • 2015-11-20
    • 1970-01-01
    • 2011-11-02
    • 2011-01-12
    • 2011-07-27
    • 2012-01-23
    相关资源
    最近更新 更多