将动态属性序列化为JSON
本文关键字:JSON 序列化 属性 动态 | 更新日期: 2023-09-27 17:58:56
我有一个Web API项目,它从JSON中对如下定义的对象进行水合。我正试图将此对象插入RavenDB数据库,但发现动态属性"Content"没有正确序列化(注意空数组)。
我已经尝试了几个序列化程序来生成json字符串:System.Helpers.json.Encode()、System.Web.Script.Serialization.JavaScriptSerializer。两者都存在相同的问题。
fromObject(obj)也遇到了同样的问题。
尽管CLR反射中存在这种明显的限制,但有没有一种方法可以实现我的目标?
public class SampleType
{
public Guid? Id { get; private set; }
public dynamic Content { get; set; }
public string Message { get; set; }
public string Actor { get; set; }
public LogEntry()
{
Id = Guid.NewGuid();
}
}
JSON submitted to API:
{
"Content": {
"SomeNumber": 5,
"ADate": "/Date(1360640329155)/",
"MaybeABoolean": true,
"EmptyGUID": "00000000-0000-0000-0000-000000000000"
},
"Message": "Hey there",
"Actor": "John Dow"
}
Hydrated object:
ID: {b75d9134-2fd9-4c89-90f7-a814fa2f244d}
Content: {
"SomeNumber": 5,
"ADate": "2013-02-12T04:37:44.029Z",
"MaybeABoolean": true,
"EmptyGUID": "00000000-0000-0000-0000-000000000000"
}
Message: "Hey there",
Actor: "John Dow"
JSON from all three methods:
{
"Id": "b75d9134-2fd9-4c89-90f7-a814fa2f244d",
"Content": [
[
[]
],
[
[]
],
[
[]
],
[
[]
]
],
"Message": "Hey there",
"Actor": "John Dow"
}
我记得我们使用了Newtonsoft JSON序列化程序,它能很好地处理动态和Expando对象。
您的动态对象必须正确地实现GetDynamicFieldNames()方法才能进行动态序列化。
您可以使用Planet最快的Servicestack.Text
库。你的问题的解决方案已经在这里得到了答案。
我真的不确定你在说什么。
public class Foo
{
public dynamic Bar { get; set; }
}
var foo = new Foo { Bar = new { A = 1, B = "abc", C = true } };
Debug.WriteLine(RavenJObject.FromObject(foo).ToString(Formatting.None));
Debug.WriteLine(JsonConvert.SerializeObject(foo, Formatting.None));
两者的输出都是:
{"Bar":{"A":1,"B":"abc","C":true}}
我错过什么了吗?