1

DataContractJsonSerializer複数のエンティティ タイプ (テーブルごとの階層) をサポートするコレクションに OData エンティティを投稿するときに必要な「odata.type」フィールドを発行する方法はありますか?

に設定さDataContractJsonSerializerれた設定オブジェクトで構築すると、出力に「__type」フィールドが出力されますが、それは OData に必要なフィールド名ではなく、値の形式も間違っています。EmitTypeInformationAlways

パイプラインにフックしてDataContractJsonSerializer、目的の「odata.type」フィールドをシリアル化出力に挿入する方法はありますか?

フィールドを注入するためにシリアライゼーション出力を解析しなければならないのは、そのようなハックです。WCF Data Services はどのようにそれを行いますか? 使用しないDataContractJsonSerializerのは私の推測です。

4

2 に答える 2

0

Json.Net の使用を検討しましたか? Json.Net ははるかに拡張性が高く、カスタム リゾルバーを使用してシナリオを実行できます。サンプルコード

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(
            JsonConvert.SerializeObject(new Customer { Name = "Raghu" }, new JsonSerializerSettings
            {
                ContractResolver = new CustomContractResolver()
            }));
    }
}

public class CustomContractResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract objectContract = base.CreateObjectContract(objectType);
        objectContract.Properties.Add(new JsonProperty
        {
            PropertyName = "odata.type",
            PropertyType = typeof(string),
            ValueProvider = new StaticValueProvider(objectType.FullName),
            Readable = true
        });

        return objectContract;
    }

    private class StaticValueProvider : IValueProvider
    {
        private readonly object _value;

        public StaticValueProvider(object value)
        {
            _value = value;
        }

        public object GetValue(object target)
        {
            return _value;
        }

        public void SetValue(object target, object value)
        {
            throw new NotSupportedException();
        }
    }
}

public class Customer
{
    public string Name { get; set; }
}
于 2013-08-22T18:56:00.923 に答える