2

このコードを使用して、JSON 文字列をPersonオブジェクトを使用して逆シリアル化しています。

JavaScriptSerializer serializer = new JavaScriptSerializer();
Person person = serializer.Deserialize<Person>(jsonString);

Personクラスには Age プロパティがあります。

int Age {get;set;}

JSON 文字列には次のような値があります。

{年齢: '無効な整数'}

次のように例外が発生します。

文字列を Int32 にキャストできません

JavaScriptSerializerエラー時にスキップして他のプロパティを続行するように指示する方法はありますか?

4

1 に答える 1

3

はい、カスタムJavaScriptConverterクラスを作成することで、逆シリアル化プロセスを制御できます。

public class PersonConverter : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        Person person = new Person();

        foreach (string key in dictionary.Keys)
        {
            var value = dictionary[key];

            switch (key)
            {
                case "Name":
                    person.Name = (string)value;
                    break;

                case "Age":
                    {
                        if (value is int)
                        {
                            person.Age = (int)value;
                        }
                        else
                        {
                            int age;
                            if (int.TryParse((string)dictionary[key], out age))
                            {
                                person.Age = age;
                            } // else leave Age as null (or if int, leave as 0); alternatively put an else block here to set to value of your choice
                        }
                    }
                    break;
            }
        }

        return person;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new[] { typeof(Person) };
        }
    }
}

ここPerson.Agenullは、年齢が不明であることを示しますが、これが受け入れられない場合は、年齢が解析できないときにコンバーターをデフォルトの 0 または -1 に変更できます。

public class Person
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

使用法:

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new PersonConverter() });
var person = serializer.Deserialize<Person>(jsonString);

出力の例:

    var serializer = new JavaScriptSerializer();
    serializer.RegisterConverters(new[] { new PersonConverter() });

    var jsonStrings = new List<string>
    {
        "{ Name: 'Steve',  Age: 21 }",
        "{ Name: 'Teoman',  Age: 'not valid int'}",
        "{ Name: 'Queen Elizabeth II',  Age: '89'}"
    };

    foreach (var jsonString in jsonStrings)
    {
        var person = serializer.Deserialize<Person>(jsonString);
        Console.WriteLine("Name: {0}, Age: {1}", person.Name, person.Age);
    }

名前:スティーブ、年齢:21歳

名前:テオマン、年齢:

名前:エリザベス2世女王、年齢:89歳

ここでは、リテラルの数値、文字列内の数値、および完全に無効な値を処理したことに注意してください。

于 2015-06-06T10:54:14.540 に答える