[英]How to deserialize JSON to only “built-in” types
首先,我很抱歉要問JSON反序列化的另一個問題。 但是,我還沒有找到答案。
我想將JSON反序列化為T
,其中T
遞歸定義為:
Dictionary<string, T>
T[]
string
(object)T
(盒裝) 我知道那里有許多JSON庫都允許指定反序列化類型,但是以我的經驗,一些自定義類型( JObject
, JsonObject
等等)會出現在對象圖中的某個位置(也就是說,返回類型似乎只適用了)到一定深度)。 由於類型與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.