C#オブジェクトをJSONとしてストリームにシリアル化したいが、スキーマに従ってオブジェクトが有効でない場合はシリアル化を避ける。 JSON.NETとJson.NETスキーマを使用してこのタスクをどのように進めるべきですか?私が見るところでは、JSONスキーマに対してC#オブジェクトの検証を可能にするJSON.NETライブラリにはメソッドがありません。 C#オブジェクトをエンコードすることなく単に検証する直接的な方法はないというのは幾分奇妙なようです。この方法が利用できない理由が分かりますか?シリアル化の前にスキーマに対してオブジェクトを検証する
1
A
答えて
3
それは、このAPIは、現在利用可能ではないようです。推測すると、検証するJSON値を再帰的に生成するには、オブジェクトをシリアライズする作業の大部分が必要となるからです。それとも、Newtonsoftの誰もいないからかもしれない。ever designed, specified, implemented, tested, documented and shipped that feature。
希望する場合は、SchemaExtensions
classの一部として、file an enhancement requestがこのAPIをリクエストしている可能性があります。一方
NullJsonWriter
をつかむ
JSchemaValidatingWriter
、テストでそれをラップすることができ、それを完全に直列化を発生させることなく、POCOをテスト・検証する必要がない場合 -
Validate JSON with JSchemaValidatingWriterのようにオブジェクトをシリアル化します。
NullJsonWriter
は実際には何も書き込まないため、完全なシリアル化(
string
または
JToken
のいずれか)を生成する際のパフォーマンスとメモリオーバーヘッドがなくなります。
まず、次の静的メソッドを追加:
// Example adapted from
// https://www.newtonsoft.com/jsonschema/help/html/JsonValidatingWriterAndSerializer.htm
// by James Newton-King
string schemaJson = @"{
'description': 'A person',
'type': 'object',
'properties': {
'name': {'type':'string'},
'hobbies': {
'type': 'array',
'maxItems': 3,
'items': {'type':'string'}
}
}
}";
var schema = JSchema.Parse(schemaJson);
var person = new
{
Name = "James",
Hobbies = new [] { ".Net", "Blogging", "Reading", "XBox", "LOLCATS" },
};
var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
var isValid = JsonExtensions.TestValidate(person, schema, (o, a) => Console.WriteLine(a.Message), settings);
// Prints Array item count 5 exceeds maximum count of 3. Path 'hobbies'.
Console.WriteLine("isValid = {0}", isValid);
// Prints isValid = False
を経由してケースに気をつけてください:そして、同じように使用
public static class JsonExtensions
{
public static bool TestValidate<T>(T obj, JSchema schema, SchemaValidationEventHandler handler = null, JsonSerializerSettings settings = null)
{
using (var writer = new NullJsonWriter())
using (var validatingWriter = new JSchemaValidatingWriter(writer) { Schema = schema })
{
int count = 0;
if (handler != null)
validatingWriter.ValidationEventHandler += handler;
validatingWriter.ValidationEventHandler += (o, a) => count++;
JsonSerializer.CreateDefault(settings).Serialize(validatingWriter, obj);
return count == 0;
}
}
}
// Used to enable Json.NET to traverse an object hierarchy without actually writing any data.
class NullJsonWriter : JsonWriter
{
public NullJsonWriter()
: base()
{
}
public override void Flush()
{
// Do nothing.
}
}
を。 Json.NETスキーマはcase sensitiveです。したがって、テスト検証の際に適切な契約リゾルバを使用する必要があります。
サンプルfiddle。
0
あなたはJSON文字列から、あなたがオブジェクトと最初に比較するためのスキーマを必要とすることはできません。..
public void Validate()
{
//...
JsonSchema schema = JsonSchema.Parse("{'pattern':'lol'}");
JToken stringToken = JToken.FromObject("pie");
stringToken.Validate(schema);
関連する問題
- 1. スキーマに対するXML(.xsd)フィード検証
- 2. 特定のXSDスキーマに対してXMLを検証する
- 3. 特定のスキーマに対してXDocumentを検証する
- 4. Swagger APIスキーマに対してJSONを検証しています
- 5. xsdスキーマに対してbig xmlを検証する方法は?
- 6. スキーマに対してXML要素を検証する
- 7. XMLスキーマに対してXPath式を検証できますか?
- 8. Mongooseスキーマ対Mongo検証ツール
- 9. Xercesを使用してAndroidのスキーマに対してXMLを検証する
- 10. Jaxb2Marshallerを使用してXMLをアンマーシャリングし、スキーマに対して検証する
- 11. XSDスキーマに対してXMLファイルを検証し、すべての検証エラーをリストする方法
- 12. XSDに対してオブジェクトの複数のバージョンを検証する
- 13. Pykwalify:辞書のデータをyamlファイルのスキーマに対して検証する
- 14. クラスパスからのXSDに対してSpring XMLスキーマを検証する
- 15. PHPのスキーマのcomplexTypeに対するXMLフラグメントの検証
- 16. 検証前にスキーマの検証で文字列をトリミングしない
- 17. C#でjsonスキーマを使用してオブジェクトを検証する
- 18. yaml構成に対してオブジェクトの値を検証します
- 19. libxml ++のrelaxNGスキーマに対するxmlドキュメントの検証方法
- 20. MVC3 - JSONにシリアル化する前にオブジェクトを変更する
- 21. 検証複数のスキーマ定義に対するXMLファイル
- 22. svnコミット前のXMLスキーマ検証
- 23. オブジェクトをJSONにシリアル化する - 動的プロパティのシリアル化
- 24. 配列に対して検証する
- 25. オブジェクトに逆シリアル化
- 26. GWTサーバー側の検証とRPCシリアル化
- 27. 逆シリアル化されたJSONオブジェクトに対するクエリ
- 28. シリアル化の前にJSonをエンコーディングする
- 29. JiBX POJOにアンマーシャリングするときのXSDスキーマに対する検証
- 30. WPFのオブジェクトをXMLにシリアル化する
あなたはこれを見ましたか? https://www.newtonsoft.com/json/help/html/JsonSchema.htm –
[NullJsonWriter]を[自動的に作成されたオブジェクトへの参照](https://stackoverflow.com/a/30650904/3744182)から取得できます。 'JSchemaValidatingWriter'でラップし、[* Validate JSON with JSchemaValidatingWriter *](https://www.newtonsoft.com/jsonschema/help/html/JsonValidatingWriterAndSerializer.htm)に示すようにオブジェクトをテスト直列化してください。 – dbc
@dbcそれをエンコードすることなくC#オブジェクトを検証する直接的な方法はないというのはやや奇妙なようです。この方法が利用できない理由が分かりますか? –