gpt4 book ai didi

c# - 运行时属性的 Web API 条件序列化

转载 作者:行者123 更新时间:2023-11-30 13:56:31 25 4
gpt4 key购买 nike

我正在考虑在 ASP.Net 中使用 WebAPI 构建 API。

我需要根据 RunTime 而不是 Compile Time 的一些自定义逻辑有条件地从 XML 或 JSON 中排除属性。

我必须从响应中删除 xml 或 json,仅包含具有 null 或空值的标签是不好的。

我尝试了各种方法,但我似乎都无法开始工作。

我试过以下方法

委托(delegate)处理程序 from here

public class ResponseDataFilterHandler : DelegatingHandler
{
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var response = task.Result;

//Manipulate content here
var content = response.Content as ObjectContent;
if (content != null && content.Value != null)
{

}

//Or replace the content
//response.Content = new ObjectContent(typeof(object), new object(), new MyFormatter());

return response;
});
}


}

当然,我可以在此处为 null 属性,但它们仍会出现在响应中。

DataContractSurrogate similar to this

 public class MySurrogate: IDataContractSurrogate
{
public object GetCustomDataToExport(Type clrType, Type dataContractType)
{
return null;
}

public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)
{
return null;
}

public Type GetDataContractType(Type type)
{
return null;
}

public object GetDeserializedObject(object obj, Type targetType)
{
return null;
}

public void GetKnownCustomDataTypes(System.Collections.ObjectModel.Collection<Type> customDataTypes)
{

}

public object GetObjectToSerialize(object obj, Type targetType)
{
if (obj == null) return null;

var type = obj.GetType();
type.GetProperties().ToList()
.ForEach(prop =>
{
try
{
var attr = prop.GetCustomAttributes(typeof(ConditionalDataMemberAttribute), false);
if (attr.Any())
{
var proptype = prop.PropertyType;
//Set the property value to its default value
prop.GetSetMethod().Invoke(obj,
new[] { proptype.IsValueType ? Activator.CreateInstance(proptype) : null });
}
}
catch { }
});


return obj;

}

public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
{
return null;
}

public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
{
return null;
}
}

同样,我只能将属性清空,不能从输出中删除 xml 或 json。

我有一个想法,我可以动态编译具有所需属性的特定类,然后使用 DataContractSurrogate 将原始实例替换为我的新动态编译类的实例 - 但我不喜欢它。

我试过查看 DataContractSerializer 但它是密封的,所以我无法从中派生 - 我也想反编译它并进行一些更改,但它再次使用内部类,例如 DataContract - 我觉得我需要连接到序列化,但我不知道该怎么做?

最佳答案

你应该使用 Json.NET 并编写你自己的转换器

public class MyJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartArray();

// write your object here based on your custom logic
writer.WriteRawValue(value);

writer.WriteEndArray();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override bool CanConvert(Type objectType)
{
return true;
}
}

您可以像这样使用您的自定义转换器

string json = JsonConvert.SerializeObject(SomeObject, new MyJsonConverter());

然后,为了避免为 Json 和 XML 编写自定义转换器,您可以将 Json 转换为 XML

XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

关于c# - 运行时属性的 Web API 条件序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27397494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com