使用ServiceStack.Text将JSON字符串反序列化为对象

10

我有一个看起来像这样的JSON字符串:

"{\"Id\":\"fb1d17c7298c448cb7b91ab7041e9ff6\",\"Name\":\"John\",\"DateOfBirth\":\"\\/Date(317433600000-0000)\\/\"}"

我正在尝试将其反序列化为object(我正在实现缓存接口)。

我遇到的问题是当我使用

JsonSerializer.DeserializeFromString<object>(jsonString);

它的返回值是

"{Id:6ed7a388b1ac4b528f565f4edf09ba2a,Name:John,DateOfBirth:/Date(317433600000-0000)/}"

这是否正确?

我无法确定任何内容...而且我也无法使用动态关键字....

有没有办法从ServiceStack.Text库中返回匿名对象?

1个回答

20

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();

看起来不错...当我这样做时,我的对象的“属性”返回(例如):[0] {[Name,John]} - 一个键/值数组...是这样吗? - Alex
我想尝试使用ServiceStack的动态API,但是对我来说JsonObject没有.Get<T>(key)方法。我只安装了“Install-Package ServiceStack.Text”。你能给我建议我可能缺少什么吗? - LukAss741
@LukAss741 .Get<T>是一个实例扩展方法,请查看主页上的链接JSON解析示例 - mythz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接