将JSON反序列化为Object

时间:2012-02-07 13:21:38

标签: c# json javascriptserializer

我正在收到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; }
    }

E.g。 JSONs:

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

但问题是我有两种不同类型的JSON消息。那么我如何知道反序列化需要什么对象呢?

2 个答案:

答案 0 :(得分: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"]);
}

答案 1 :(得分: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);

有关其他说明,请参阅该链接。