【问题标题】:How to deserialize an untyped object using JSON.NET or DataContractJsonSerializer如何使用 JSON.NET 或 DataContractJsonSerializer 反序列化无类型对象
【发布时间】:2014-01-31 00:59:39
【问题描述】:

我试图在反序列化时重新创建一个对象。通过重新实现 Serialize 和 Deserialize 方法,以便我能够独立使用它们。由于我会将序列化对象存储在数据库中,因此我将无法访问对象的类型(类)。 问题是:有没有办法在没有对象类型的情况下反序列化和对象,只有它是 JSON 字符串?有什么方法可以从 JSON 字符串中获取它的类型?

方法如下:

DataContractJsonSerializer

public string Serialize(object aoObject)
    {
      MemoryStream stream = new MemoryStream();
      DataContractJsonSerializer serializer = new     DataContractJsonSerializer(aoObject.GetType());

      serializer.WriteObject(stream, aoObject);

      return Encoding.Default.GetString(stream.ToArray());
    }

    public object Deserialize(string asObject)
    {
      MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(asObject));

      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(["the type of the object"]));

      return serializer.ReadObject(stream);
    }

JSON.NET

public string Serialize(object aoObject)
{
  DefaultContractResolver dcr = new DefaultContractResolver();
  dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
  JsonSerializerSettings jss = new JsonSerializerSettings();
  jss.TypeNameHandling = TypeNameHandling.All;
  jss.ContractResolver = dcr;

  string asObject = JsonConvert.SerializeObject(loObject, jss);

}

public object Deserialize(string asObject)
{
  ["type of the object"] fake2 = JsonConvert.DeserializeObject(asObject);
}

【问题讨论】:

    标签: c# asp.net json serialization


    【解决方案1】:

    Json.Net 有一个 TypeNameHandling 枚举,可以在序列化程序设置中指定它来执行您想要的操作(请参阅文档 here)。听起来你想要 TypeNameHandling.All。

    具体来说,试试:

    var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
    var serialized = JsonConvert.SerializeObject(value, settings);
    var deserialized = JsonConvert.DeserializeObject(value, settings);
    

    当然,这要求相关类型在序列化和反序列化应用程序中都可用。如果没有,Json.Net 始终可以反序列化为 JObjectIDictionary<string, object>,从而允许动态访问这些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多