簡體   English   中英

如何使用JSON.NET或DataContractJsonSerializer反序列化未類型化的對象

[英]How to deserialize an untyped object using JSON.NET or DataContractJsonSerializer

我試圖在反序列化對象時重新創建它。 通過重新實現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);
}

Json.Net有一個TypeNameHandling枚舉,可以在序列化程序設置中指定該枚舉來執行您想要的操作(請參閱此處的文檔)。 聽起來您想要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> ,從而允許動態訪問值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM