【问题标题】:Deserialize json with json.net c#使用 json.net c# 反序列化 json
【发布时间】:2009-09-04 10:06:02
【问题描述】:

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

我有办法从反序列化中获得一个直接的数组吗?

干杯

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    你可以使用匿名类:

    T DeserializeJson<T>(string s, T templateObj) {
        return JsonConvert.Deserialize<T>(s);
    }
    

    然后在你的代码中:

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

    【讨论】:

      【解决方案2】:

      不幸的是,JSON 在序列化时不支持类型信息,它的纯对象字典而不是完整的类数据。您必须编写某种扩展来扩展 JSON 序列化器和反序列化器的行为,以支持正确的类型编组。

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

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

      【讨论】:

      • 不,如果您在对 Deserialize 的调用中指定了正确的根类型,Json.NET 将知道这些类型。
      • 如果我的属性有基类型并且它的值是派生类型怎么办? Soap 支持这种类型映射。 JSON 不完全支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多