gpt4 book ai didi

c# - 使用 JSON 序列化请求对象

转载 作者:可可西里 更新时间:2023-11-01 08:43:00 26 4
gpt4 key购买 nike

我目前正在进行概念验证,遇到了一个涉及使用 JSON 序列化 HttpRequest 的问题。

背景

我原本以为我可以使用 JSON.Encode() 轻松完成它方法如下所示:

JSON.Encode(HttpContext.Request)

但是,我很快发现这会导致抛出各种循环引用(主要是由于 Request 对象的实际结构和复杂性)。这些只会在实际遇到包含循环引用的属性时发生,因为我之前使用以下代码来获取我需要的特定元素:

JSON.Encode(new {HttpContext.Request.Cookies,HttpContext.Request.Headers, ... });

效果很好。

我只是好奇是否有更好的方法来处理这个问题(或者最好的处理方法是什么)。我将在下面详细介绍到目前为止我所采用的一些方法,以找出我可能出错的任何地方。

以前的方法

  • 使用反射遍历每个属性请求并尝试构造一个 JSON 字符串“逐个属性”。 (遇到通告时失败引用)

  • 尝试将每个属性存储在字典对象中,然后使用 JSON 序列化整个字典(希望它将对象“扁平化”并使其更易于序列化)

  • 使用 JSON.NET library并尝试通过 JsonConvert.SerializeObject() 方法对其进行序列化(我尝试传递几个额外的设置以避免循环引用,但没有成功)

    <

我认为我的最新方法(使用 JSON.NET 库)会接近工作,但是我遇到了一个错误,该错误涉及请求中 Stream 对象的“Timeout”属性。

我并不反对简单地避免序列化 Stream 对象和循环引用。我只是想尽可能多地获取 Request 对象,同时避免任何此类事故。

最佳答案

我只是试图做同样的事情,我现在已经设法使用 JsonConvert 和契约(Contract)解析器进行序列化以忽略所有问题属性 - 我使用这一行进行序列化:

string reqStr = JsonConvert.SerializeObject(context.Request,
Formatting.Indented, new JsonSerializerSettings {
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new IgnoreErrorPropertiesResolver()
});

这是我使用的契约(Contract)解析器代码:

public class IgnoreErrorPropertiesResolver : DefaultContractResolver
{

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

if (["InputStream",
"Filter",
"Length",
"Position",
"ReadTimeout",
"WriteTimeout",
"LastActivityDate",
"LastUpdatedDate",
"Session"
].Contains(property.PropertyName)) {
property.Ignored = true;
}
return property;
}
}

这将需要使用 Newtonsoft.Json.SerializationSystem.Reflection

碰巧我不能在我所在的位置包含 Session 对象,所以它在我的忽略属性列表中 - 如果可以包含它,显然将其删除!

关于c# - 使用 JSON 序列化请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15755645/

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