使用Json.net在C#中反序列化json

5

我是一名 Json 新手,对此还不够了解。

我有一个基于 Rest 的服务,它返回一个 json 字符串;

{"treeNode":[{"id":"U-2905","pid":"R","userId":"2905"},
{"id":"U-2905","pid":"R","userId":"2905"}]}

我一直在使用Json.net并尝试将字符串反序列化为对象等。我编写了一个扩展方法来帮助。

public static T DeserializeFromJSON<T>(this Stream jsonStream, Type objectType)
        {
            T result;

            using (StreamReader reader = new StreamReader(jsonStream))
            {
                JsonSerializer serializer = new JsonSerializer();
                try
                {
                    result = (T)serializer.Deserialize(reader, objectType);
                }
                catch (Exception e)
                {   
                    throw;
                }

            }
            return result;
        }

我原本期望得到一个treeNode[]对象的数组。但是似乎只有在另一个对象的treeNode[]属性中才能正确反序列化。
public class treeNode
{
    public string id { get; set; }
    public string pid { get; set; }
    public string userId { get; set; }
}

有没有一种方法可以从反序列化中直接获取一个简单的数组呢?
谢谢。
2个回答

3
您可以使用匿名类:
T DeserializeJson<T>(string s, T templateObj) {
    return JsonConvert.Deserialize<T>(s);
}

在你的代码中:

return DeserializeJson(jsonString, new { treeNode = new MyObject[0] }).treeNode;

0

很遗憾,JSON在序列化时不支持类型信息,它只是一个纯粹的对象字典,而不是完整的类数据。您将需要编写某种扩展来扩展JSON序列化器和反序列化器的行为,以支持适当的类型编组。

如果期望的类型是确切的而不是派生类型,则提供根类型将正确映射对象图。

例如,如果我有一个基类数组属性,我的实际值可以包含任何类型的派生子类。JSON并不完全支持它,但Web服务(SOAP)允许您使用动态类型序列化对象。


2
不需要,如果您在调用Deserialize时指定了正确的根类型,Json.NET将会知道这些类型。 - erikkallen
如果我的属性具有基本类型并且其值是派生类型,该怎么办?Soap支持这种类型映射。JSON并不完全支持它。 - Akash Kava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接