如何为名称/值结构创建 JSON 模式?

Posted

技术标签:

【中文标题】如何为名称/值结构创建 JSON 模式?【英文标题】:How to create JSON Schema for Name/Value structure? 【发布时间】:2014-04-09 08:53:03 【问题描述】:

我的问题是我将 map 的内容序列化为 JSON。

在输出 (JSON) 中,我有遵循键/名称语法规则的对象。

键是从映射键创建的,名称是从值创建的。

模型示例:

  class Storage 
       Map<String,String> values = new HashMap<>();

      
         map.put("key1","key1");
         map.put("key2","key2");
         map.put("key3","key3");
      

    

JSON 示例对象:


  key1=value1,
  key2=value2,
  key3=value3


JSON 架构:


  "name": "storage",
  "description": "Store of key values",
  "properties": 
    // How can we describe the properties if we do not know the name ?
   

问题是我不知道这些值是什么,但我知道它们会是一些。

您能帮我提供架构的完整定义吗?


免责声明:

我知道这个也可以序列化为

 
    values: [
       key="key1", value="value1",
       key="key2", value="value2",
       key="key3", value="value3"
    ]
 

但不想在 JSON 中有数组。

【问题讨论】:

听起来你拥有的属性将是一个“key”数组:“value”: 我不想有一对数组。我希望将 key=value 作为对象的一部分,该部分有效且易于反序列化。 所以您要问的是如何为您不知道先验名称的情况指定名称、值对?做不到。无论如何,您的目标不是能够重构 HashMap 吗?在这种情况下,您将通过一个循环添加 Key, value 。 你可能是对的。但是如果有一种有效的方法来序列化和反序列化这样的对象应该可以为它创建一个模式。建议人们可以期待一些内部未定义的对象。 【参考方案1】:

假设您的验证器支持它,您可以使用patternProperties。

对于架构...


  "title": "Map<String,String>",
  "type": "object",
  "patternProperties": 
    ".1,":  "type": "string" 
  

...还有文件...


    "foo":"bar",
    "baz":1

...属性 foo 的值是有效的,因为它是一个字符串,但 baz 因为它是一个数字,所以验证失败。

【讨论】:

更简单:使用"additionalProperties": "type": "string" 。这指定任何未另行指定的属性都必须满足给定的架构。 ".1," 将此解决方案用于具有 Map 键值的数据可以解决我的问题。我很高兴你发布了。谢谢。【参考方案2】:

我使用了@augurar 建议的解决方案 “附加属性”:“类型”:“字符串”

对于 AWS API Gateway 模型 .... 并且 SDK 能够根据 Java / android SDK 的要求生成 Map 变量

@Arne Burmeister - 就我而言 - 解决方案 1 没有按需要工作 - 尽管它在模型中没有给出任何错误(已创建架构)

【讨论】:

以上是关于如何为名称/值结构创建 JSON 模式?的主要内容,如果未能解决你的问题,请参考以下文章

[iPhone]你将如何为下面给出的结构设计核心数据对象模型

System.Text.Json:如何为枚举值指定自定义名称?

Pybind11:如何为结构成员变量分配默认值?

如何为仅在测试中可见的结构创建 init 方法?

如何在 iOS XCode 中为 JSON 定义结构?

如何为嵌套 JSON 中存在 JSON 列表的嵌套 JSON 创建模型?