0

JSON から次のように定義されたオブジェクトをハイドレートする Web API プロジェクトがあります。このオブジェクトを RavenDB データベースに挿入しようとしていますが、動的プロパティ 'Content' が適切にシリアル化されていないことがわかりました (空の配列に注意してください)。

json 文字列を生成するためにいくつかのシリアライザーを試しました: 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

4 に答える 4

0

動的シリアル化が機能するには、動的オブジェクトがGetDynamicFieldNames()メソッドを適切に実装する必要があります。

于 2013-02-12T08:07:22.370 に答える
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}}

私は何か見落としてますか?

于 2013-02-12T16:52:13.853 に答える