1

逆シリアル化する必要がある JSON を受信して​​います。そのために JavaScriptSerializer を使用しています。
例: オブジェクト

class Player
    {
        public string name{ set; get; }
        public float yPos { set; get; }
        public float xPos { set; get; }
    }

class Communication
    {
        public string id{ set; get; }
        public string message{ set; get; }
        public string status{ set; get; }
    }

例: JSON:

var json1 = "[{\"name\":\"Master\",\"xPos\":\"34.67\",\"yPos\":\"85.36\"}, {\"name\":\"Puppet\",\"xPos\":\"19.56\",\"yPos\":\"75.19\"}]";

var json2 = "[{\"id\":\"5697862\",\"message\":\"Hello\",\"status\":\"85.36\"}, {\"id\":\"4698458\",\"message\":\"Hi\",\"status\":\"75.19\"}]";

デシリアライザーの方法:

private static List<T> Deserialize<T>(string json)
        {
            var s = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<T> obj = s.Deserialize<List<T>>(json);
            return obj;
        }

しかし、ここに 2 つの異なる種類の JSON メッセージが来るという問題があります。では、どのオブジェクトを逆シリアル化する必要があるかをどのように判断すればよいでしょうか?

4

2 に答える 2

2

特定のクラスに逆シリアル化する代わりに、結果を動的に処理できます

var js = new JavaScriptSerializer();
dynamic dynObj =  js.DeserializeObject(jsonN);
foreach (var obj in dynObj)
{
    if (obj.ContainsKey("name")) Console.WriteLine(obj["name"]);
    else Console.WriteLine(obj["message"]);
}
于 2012-02-07T13:52:39.323 に答える
1

DataContractJsonSerializer (逆シリアル化も可能) を確認することをお勧めします。このクラスにより、JSON との間でそれぞれシリアライズおよびデシリアライズするときに、特定のコントラクトに従っていることが保証されます。

逆シリアル化の場合、次のように機能します。

stream1.Position = 0;
Person p2 = (Person)ser.ReadObject(stream1);

シリアル化は次のように機能します。

MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
ser.WriteObject(stream1, p);

追加の説明については、リンクを参照してください。

于 2012-02-07T13:31:02.557 に答える