是否使用DataContractJsonSerializer发出odata.type字段?

是否使用DataContractJsonSerializer发出odata.type字段?,json,wcf-data-services,odata,Json,Wcf Data Services,Odata,在将odata实体发布到支持多个实体类型(每个表的层次结构)的集合中时,是否有方法使DataContractJsonSerializer发出所需的“odata.type”字段 如果我使用设置对象构建DataContractJsonSerializer,将EmitTypeInformation设置为Always,它会在输出中发出一个“\uu type”字段,但这不是OData所需的字段名,值的格式也错误 是否有任何方法可以连接到DataContractJsonSerializer管道,将所需的“o

在将odata实体发布到支持多个实体类型(每个表的层次结构)的集合中时,是否有方法使
DataContractJsonSerializer
发出所需的“odata.type”字段

如果我使用设置对象构建
DataContractJsonSerializer
,将
EmitTypeInformation
设置为
Always
,它会在输出中发出一个“\uu type”字段,但这不是OData所需的字段名,值的格式也错误

是否有任何方法可以连接到
DataContractJsonSerializer
管道,将所需的“odata.type”字段注入序列化输出

为了注入字段,必须解析序列化输出,这将是一种黑客行为。WCF数据服务是如何做到这一点的?我猜没有使用DataContractJsonSerializer。

你考虑过使用吗?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; }
}

我无法回答您的前两个问题,但对于第三个问题,我在网站上找到了指向的链接。下载该代码时,您将看到它们手动执行所有序列化和反序列化。他们的两个Json文件夹中有68个文件!通过查看代码,他们有如下评论:

//这是一个解决方案,客户端的needTypeOnWire始终=true:
//ClientedModel的反射不能知道属性是开放类型的,即使它是开放类型的,所以这里
//使客户端始终为枚举写入“odata.type”。
因此,对我来说,这意味着没有简单、干净、简单、优雅的方式来做这件事


我试着使用
JavaScriptConverter
动态
类型和其他东西,但大多数人最终使用了反射,这使得解决方案更加复杂,而不仅仅是使用字符串操作方法。

如果所讨论的数据类型复杂而深入,我可能会求助于第三方库。我们的数据类型简单而浅显,因此我可以用一些拼凑在一起的字符串concat手工生成所需的JSON。让我恼火的是,WCF以我需要的方式发出JSON,但我不知道如何让它也为我发出JSON。当我想要的代码已经在我的过程中时,我不想依赖另一个外部库,我只是不知道如何获得它。