2013-08-21 44 views
1

有沒有辦法讓DataContractJsonSerializer發佈OData實體到支持多個實體類型(每個表的層次結構)的集合中時所需的「odata.type」字段?使用DataContractJsonSerializer發送odata.type字段?

如果你建造DataContractJsonSerializer一個設置與EmitTypeInformation集對象Always,它發出的輸出「__type」字段,但是這並不需要OData的字段名和值的格式錯誤,以及。

是否有任何方法掛鉤到DataContractJsonSerializer管道將所需的「odata.type」字段注入序列化輸出?

爲了注入該字段,必須解析序列化輸出纔是一種詭計。 WCF數據服務如何做到這一點?我的猜測是不使用DataContractJsonSerializer

回答

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; } 
} 
+0

如果問題的數據類型複雜而深入,我可能會轉向第三方庫。我們的數據類型很簡單和淺,所以我可以用一些拼湊在一起的字符串連接來手工發出所需的JSON。令我感到厭煩的是WCF以我需要的方式發佈JSON,但我無法弄清楚如何讓它爲我做到這一點。當代碼做我想要的東西已經在我的過程中時,我寧願不要依賴另一個外部庫,我只是不知道如何去實現它。 – dthorpe

0

我不能回答你的前兩個問題,但對於第三個問題,我在OData Team blog找到了一個鏈接到OData WCF Data Services V4 library open source code。下載該代碼,您將看到它們手動執行所有序列化和反序列化。他們在兩個Json文件夾中有68個文件!並希望通過代碼,他們有這樣的議論:

// This is a work around, needTypeOnWire always = true for client side: 
// ClientEdmModel's reflection can't know a property is open type even if it is, so here 
// make client side always write 'odata.type' for enum. 

所以這對我那種暗示有沒有簡單,乾淨,簡單,優雅的方式來做到這一點。

我試過使用JavaScriptConverterdynamic類型和其他東西,但他們中的大多數最終都採取了使用反射,這只是一個更復雜的解決方案,而不是使用字符串操作方法。

相關問題