在 ServiceStack.Common 中使用 JS Utils 是反序列化未知类型的自定义 JSON 的首选方式,因为它将根据 JSON 负载返回相应的 C# 对象,例如对对象进行反序列化:
var obj = JSON.parse("{\"Id\":\"..\"}");
会返回一个弱类型的 Dictionary<string,object>
,您可以将其转换为访问JSON对象动态内容:
if (obj is Dictionary<string,object> dict) {
var id = (string)dict["Id"];
}
但是如果你喜欢使用ServiceStack.Text的类型化JSON序列化程序,它无法反序列化为一个对象,因为它不知道要反序列化成什么类型,所以它将其保留为字符串,而字符串是一个对象。
考虑使用ServiceStack的动态API来反序列化任意JSON,例如:
var json = @"{\"Id\":\"fb1d17c7298c448cb7b91ab7041e9ff6\",
\"Name\":\"John\",\"DateOfBirth\":\"\\/Date(317433600000-0000)\\/\"}";
var obj = JsonObject.Parse(json);
obj.Get<Guid>("Id").ToString().Print();
obj.Get<string>("Name").Print();
obj.Get<DateTime>("DateOfBirth").ToLongDateString().Print();
或将其解析为动态内容:
dynamic dyn = DynamicJson.Deserialize(json);
string id = dyn.Id;
string name = dyn.Name;
string dob = dyn.DateOfBirth;
"DynamicJson: {0}, {1}, {2}".Print(id, name, dob);
另一种选择是告诉ServiceStack将对象类型转换为Dictionary,例如:
Another option is to tell ServiceStack to convert object types to a Dictionary, e.g:
JsConfig.ConvertObjectTypesIntoStringDictionary = true
var map = (Dictionary<string, object>)json.FromJson<object>()
map.PrintDump()
.Get<T>
是一个实例扩展方法,请查看主页上的链接JSON解析示例。 - mythz