如何确保类库完美地表示Json Schema

时间:2017-09-29 11:45:44

标签: c# json json.net jsonschema

我有一个JSON Schema和一个类库。 我能够序列化这个类,然后成功转换回对象。 为了测试它,我创建了一个随机对象,序列化它。 然后转换为对象并检查其有效性。 并且反序列化它只是为了确定值。

下面的代码完美无缺 - 但是 我想绝对确定类库代表Json Schema。

有没有办法实现这个目标?我发现一些在线工具试图从给定的模式创建类库,但它们都没有那么有用。

  // Create random object.
  MyObject myObject = new MyObject().CreateRandomMyObject();
  // Serialize it.
  string JSONObjectText = JsonConvert.SerializeObject(myObject);

  // Check if schema is valid.
  JSchema schema = JSchema.Parse(txtSchema.Value);

  // Check if the serialized object is valid for schema.
  JObject jsonObject = JObject.Parse(JSONObjectText);
  IList<string> errorMessages;
  bool valid = jsonObject.IsValid(schema, out errorMessages);

  // Check if the serialized object can be deserialized.
  MyObject myObjectReDeserialized = (MyObject)JsonConvert.DeserializeObject(JSONObjectText, typeof(MyObject), new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Error });

1 个答案:

答案 0 :(得分:2)

一种对映射进行面向测试的断言的方法是使用FsCheck生成大量随机对象,然后断言你想要保留它们的内容:在这种情况下,

  • 根据架构
  • ,它们的序列化是有效的
  • 可以将它们反序列化回同一个对象。 (你应该确保你在那里使用结构平等。)

确切地说,此类方法仅检查对象描述的所有内容是否可由模式表示。您可能还想以另一种方式执行 - 符合架构的每个JSON都可以由您的对象表示。同样,您可以生成许多符合模式的可能JSON并检查

  • 可以将它们反序列化为您的对象,
  • 这些对象的重新序列化为您提供了与之相同的JSON。

请注意,这可能不实用:FsCheck可能没有一些不错的,一流的支持基于JSON模式的开箱即用。

如果您将来的模式将会发生变化,那么即使在the boundary of your application,也可以通过某种方式生成相应的对象以获得强类型。你试过Swagger Codegen吗? Swagger使用JSON Schema的子集描述它的端点。相应的工具可能会对您有所帮助。