簡體   English   中英

如何將JSON反序列化為僅“內置”類型

[英]How to deserialize JSON to only “built-in” types

首先,我抱歉要問JSON反序列化的另一個問題。 但是,我還沒有找到答案。

我想將JSON反序列化為T ,其中T遞歸定義為:

  • Dictionary<string, T>
  • T[]
  • string
  • 原始類型
  • (object)T (盒裝)

我知道那里有許多JSON庫都允許指定反序列化類型,但是以我的經驗,一些自定義類型( JObjectJsonObject等等)會出現在對象圖中的某個位置(也就是說,返回類型似乎只適用了)到一定深度)。 由於類型與JavaScript幾乎一對一地映射,因此似乎很簡單。

編輯

理想情況下,我希望JSON是“干凈的”,也就是說,沒有特殊的字段(“ __type”等)有助於反序列化。 它應該是JavaScript的直接映射: JObject > IDictionary<string, T>JArray > T[]等等。

同時,我正在使用FParsec解析器和手動滾動序列化器。 效果很好,但我認為可能已經有一些解決方案了。

我不太確定“我想將JSON反序列化為T,其中T被遞歸定義為”的含義,我的假設是您希望能夠序列化和反序列化上面列出的任何類型,並且任意組合。

我的經驗表明, System.Runtime.Serialization.Json特別是DataContractJsonSerializer中可用的標准DotNet庫足以勝任您描述的工作,並且可以成功處理您提到的所有類型(無元數據描述),僅此一種。 T的裝箱對象。但是,我的假設是,沒有提供元數據,任何庫都無法處理T的裝箱對象(怎么辦?它對您的對象一無所知)

這是一些我用來在我的應用程序中提供序列化的代碼

public class JSONSerializer<T>
{

    public static string Serialize(T obj)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream()) {
            serializer.WriteObject(stream, obj);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    public static T Deserialize(string json)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json))) {
            return (T)serializer.ReadObject(stream);
        }
    }

}

PS:還請注意,DataContractSerializer無需使用任何代理類型對象(至少不在輸出或輸入中,可能不在內部)進行“純”序列化和反序列化。

您不能使用泛型。 那是因為泛型必須在編譯時剝離為一個單一類型。 但是JSON對象或數組值應為任何JSON類型,並且是沖突的。

但是,如果您願意,可以使用object然后進行轉換。 JSON數組是object[] ,JSON對象是Dictionary<string,object> 但這只是您提到的自定義類型的變體。

暫無
暫無

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

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