0
private static void WriteJson(string filepath, 
                              string filename, 
                              JsonSchema jsonschema)
        {
        using (TextWriter writer = File.CreateText(
                       @"C:\Users\ashutosh\Desktop\Output\" + filename + ".js"))
        using (var jtw = new JsonTextWriter(writer))
            {
            jtw.Formatting = Formatting.Indented;
            jsonschema.WriteTo(jtw);
            }
        //var json = JsonConvert.SerializeObject(
        //        jsonschema, Formatting.Indented, 
        //        new JsonSerializerSettings { 
        //                 NullValueHandling = NullValueHandling.Ignore });
        //    File.WriteAllText(
        //       @"C:\Users\ashutosh\Desktop\Output\" + filename + ".js", json);
        }

JSON.net から JSONSchema を作成し、それを書き出しています。私は

Invalid Operation Exception Sequence contains no matching element

しかし、通常のものの代わりにコメント付きのコードを使用すると。そのような例外は発生しません。

1) この例外の原因は何ですか? 2)私は2番目の方法を喜んで使用しましたが、直感的ではなく、(配列、整数、ブールなど)の代わりにschema.TypeのJsonTypeの整数値を出力します。

この状況から抜け出すにはどうすればよいですか?

UPDATEPropertiesの " " プロパティのJsonSchemaカウント = 0 の 場合、例外が発生します。PropertiesですDictionary<String,JsonSchema>。nullではないように初期化しました。最終的に、コードは要素を追加する場合と追加しない場合があります。そのため、カウントは 0 のままになる場合があります。

4

1 に答える 1

1

デフォルトでは、列挙型は対応する整数値にシリアル化されます。シリアライザーの設定を指定することで、簡単に変更できStringEnumConverterます。

var json = JsonConvert.SerializeObject(jsonschema, Formatting.Indented,
    new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore,
        Converters = new List<JsonConverter> { new StringEnumConverter() }
    });

編集

この簡単なテスト コードを実行します。

var schema = new JsonSchemaGenerator().Generate(typeof(CustomType));
Debug.Assert(schema.Properties.Count == 0);
using (TextWriter textWriter = File.CreateText(@"schema.json"))
using (var jsonTextWriter = new JsonTextWriter(textWriter))
{
    jsonTextWriter.Formatting = Formatting.Indented;
    schema.WriteTo(jsonTextWriter);
}

// CustomType is a class without any fields/properties
public class CustomType { }

上記のコードは、スキーマを次のように正しくシリアル化します。

{
    "type": "object",
    "properties": {}
}

生成しているスキーマは正しいですか? シリアライザーは、実際には何もないときにいくつかのプロパティを処理する必要があると「考えている」ようです。スキーマを生成するタイプを表示できますか? 無効なスキーマを生成する型に問題がある可能性がありますが、それでも再現できません。

于 2012-01-05T15:38:07.163 に答える