2016-03-02 68 views
-1

我嘗試實現ASP.NET MVC 5 WebAPI修補程序。但是int值和枚舉存在一個問題。 JSON反序列化「思考」,這是更好的轉換詮釋爲長,所以是因爲在我int屬性我recive總是0 ...c#JSONPatch不與int和枚舉工作

因此,我發現「Microsoft.AspNet.JsonPatch.JsonPatchDocument」(還有很多人療法)

接着的問題是,我recive八方通空在我的模型

public async Task<IHttpActionResult> Patch(int id, [FromBody] Microsoft.AspNet.JsonPatch.JsonPatchDocument<Customer> model) 
{ 
    //model is allways == null 
} 

我使用郵遞員補丁派在車身>原始JSON。標題是應用程序/ json。

我不明白爲什麼模型爲null ...我需要在WebApiConfig上做任何事情?

儘管我試圖實現一個自定義JsonConverter,但問題是我有很多枚舉類型,我需要爲每個枚舉創建一個?我嘗試sothing這樣的:

public class Int32EnumConverter<T> : JsonConverter 

但問題是,你需要實現這個WebApiConfig.cs:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Int32EnumConverter<[I NEED HEAR Dynamic Enum Types>>);  

沒有任何人幫我?謝謝!

+0

爲什麼不直接使用Json.net而不需要註冊其他序列化程序呢? – Marco

+0

因爲JSON.net在http patch deserialize int long ... – rockxl1

+0

我仍然無法看到問題是什麼。 – Marco

回答

1

找到了!我做了我對增量補丁

public class JSONPatch<T> 
    { 
     private Dictionary<string, object> propsJson = new Dictionary<string, object>(); 

     public JSONPatch() 
     { 
      Stream req = HttpContext.Current.Request.InputStream; 
      req.Seek(0, System.IO.SeekOrigin.Begin); 
      string json = new StreamReader(req).ReadToEnd(); 
      propsJson = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); 
     } 

     public JSONPatch(object model) 
     { 
      propsJson = JsonConvert.DeserializeObject<Dictionary<string, object>>(model.ToString()); 
     } 

     public void Patch(T model) 
     { 

      PropertyInfo[] properties = model.GetType().GetProperties(); 

      foreach (PropertyInfo property in properties) 
      { 
       try 
       { 
        if (!propsJson.Any(x => x.Key.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase))) 
         continue; 

        KeyValuePair<string, object> item = propsJson.First(x => x.Key.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase)); 

        Type targetProp = model.GetType().GetProperty(property.Name).PropertyType; 

        Type targetNotNuable = Nullable.GetUnderlyingType(targetProp); 

        if (targetNotNuable != null) 
        { 
         targetProp = targetNotNuable; 
        } 


        if (item.Value.GetType() != typeof(Int64)) 
        { 

         object newA = Convert.ChangeType(item.Value, targetProp); 

         model.GetType().GetProperty(property.Name).SetValue(model, newA, null); 

        } 
        else 
        { 
         int value = Convert.ToInt32(item.Value); 

         if (targetProp.IsEnum) 
         { 
          object newA = Enum.Parse(targetProp, value.ToString()); 
          model.GetType().GetProperty(property.Name).SetValue(model, newA, null); 
         } 
         else 
         { 
          object newA = Convert.ChangeType(value, targetProp); 
          model.GetType().GetProperty(property.Name).SetValue(model, newA, null); 
         } 

        } 

       } 
       catch 
       { 

       } 


      } 
     } 

    } 

現在:

public async Task<IHttpActionResult> Patch(int id, [FromBody]JSONPatch<Customer> model) 
     { 
.... 

Atention:不是100%測試!空值失敗。