是否使用DataContractJsonSerializer发出odata.type字段?
在将odata实体发布到支持多个实体类型(每个表的层次结构)的集合中时,是否有方法使是否使用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
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。当我想要的代码已经在我的过程中时,我不想依赖另一个外部库,我只是不知道如何获得它。