将动态属性序列化为JSON

时间:2013-02-12 05:08:56

标签: c# json serialization ravendb square-bracket

我有一个Web API项目,它可以为JSON中定义的以下对象提供水分。我试图将此对象插入到RavenDB数据库中,但我发现动态属性“内容”未正确序列化(请注意空数组)。

我已经尝试了几个序列化程序来生成json strins:System.Helpers.Json.Encode(),System.Web.Script.Serialization.JavaScriptSerializer。两者都有同样的问题。

RavenJObject.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"
}

4 个答案:

答案 0 :(得分:2)

我记得我们使用的是Newtonsoft JSON序列化程序,它处理得很动态,而且Expando对象很好。

答案 1 :(得分:0)

您可以使用Planet最快的库Servicestack.Text。已解决您问题的解决方案here

答案 2 :(得分:0)

您的动态对象必须正确实现GetDynamicFieldNames()方法才能使动态序列化工作。

答案 3 :(得分:0)

我真的不确定你的目标是什么。

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}}

我错过了什么吗?