如何确保 class 库完美地表示 Json 模式

How to ensure that the class library represents the Json Schema perfectly

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

下面的代码可以完美运行——但是 我想绝对确定 class 库代表 Json 架构。

有办法实现吗?我发现一些在线工具试图从给定的模式创建 class 库,但其中 none 非常有用。

  // 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 });

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

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

准确地说,这种方法只检查对象描述的所有内容是否都可以由模式表示。您可能还想采用另一种方式——每个符合模式的 JSON 都可以由您的对象表示。同样,您可以生成许多符合模式的可能 JSON 并检查

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

注意,这可能不切实际:FsCheck 可能没有一些很好的,第一个 class 支持 JSON 基于模式的开箱即用的生成。

如果您拥有的模式将来会发生变化,即使在 the boundary of your application. Have you tried Swagger Codegen 时也能有一种方法生成具有强类型的相应对象真的很棒吗? Swagger 使用 JSON 模式的子集描述它的端点。相应的工具可能会对您有所帮助。