2017-01-27 2 views
1

私はカスタム特定のAPI呼び出しのためにjsonのシリアル化を使用しました。 しかし、グローバルフォーマットを上書きします。このAPI呼び出しの後、または他のすべてのAPI呼び出しの開始時にこのシリアル化をリセットする必要があります。各Web API呼び出しの後にシリアル化をリセットする方法:C#

public class ShouldSerializeContractResolver : CamelCasePropertyNamesContractResolver 
{ 
    private List<Serializable> _serializables; 

    public ShouldSerializeContractResolver(List<Serializable> serializable) 
    { 
     _serializables = serializable; 
    } 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 

     foreach (var item in _serializables) 
     { 
      if (item.ObjectType.Contains(property.DeclaringType) && !item.Serialize.Contains(property.PropertyName)) 
      { 
       property.ShouldSerialize = 
        instance => 
        { 
         return false; 
        }; 
      } 
     } 

     return property; 
    } 
} 

そして、下図のように、私は直接APIコントローラからこのシリアライザと呼ば:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 

    List<Serializable> serializableList = new List<Serializable>(); // Model class for storing list of Model classes and corresponding serializable objects as string 
     List<Type> listObjectType = new List<Type>(); 
     List<string> serialize = new List<string>(); 

     listObjectType.Add(typeof(ModelClassName)); 
     serialize.Add("classObject1"); 
     serialize.Add("classObject2"); 
     serializableList.Add(new Serializable 
     { 
      Serialize = serialize, 
      ObjectType = listObjectType 
     }); 

    json.SerializerSettings.ContractResolver = new ShouldSerializeContractResolver(serializableList); // This is where the serializer is modified 
+4

リセットしますか?どのように使っているのか教えていただけますか? – Amy

+0

はいAmy、シリアル化を特定のAPIに限定する必要があります。したがって、新しいAPIが呼び出されると、このシリアル化設定は適用されません。上記の質問の使用方法を更新しました – Vidyesh

答えて

1

フィルタとして「ResetSerializeContractResolverFilter.cs」を追加しました。

public class ResetSerializeContractResolverFilter : System.Web.Http.Filters.ActionFilterAttribute 
    { 
    public ResetSerializeContractResolverFilter() 
    { 

    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
     json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
     json.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
     base.OnActionExecuting(actionContext); 
    } 
    } 

そしてIは

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     // Add filter for resetting contractresolver 
     var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters; 
     filters.Add(new ResetSerializeContractResolverFilter()); 
    } 

下に示すように、「Global.asaxの」からフィルタ、のApplication_Startは、したがって、このフィルタは、各APIコールで呼び出され、デフォルトとしてリセットするシリアライザを取得することが含まれます。

0

特定のアクションにShouldSerializeContractResolverシリアライザを使用するには、応答と一緒にmehodに直接serializerSettingsプロパティを使用することができます。

public HttpResponseMessage Get(){ 
    List<Product> result = new List<Product>(); 
     //bind data to list 
    var formatter = new JsonMediaTypeFormatter(); 
    var json =formatter.SerializerSettings; 

    json.ContractResolver = new ShouldSerializeContractResolver(); 

    return Request.CreateResponse(HttpStatusCode.OK, result, formatter); 
} 
+0

これは試してみる価値があるようです。ありがとうBalaji – Vidyesh

+0

しかし、これは今後のAPIのシリアライザも設定します。これをAPI固有のものに限定する必要があります。 – Vidyesh

関連する問題