如何在序列化之前确定 JSON 表示形式的长度
本文关键字:表示 JSON 序列化 | 更新日期: 2023-09-27 18:34:37
我正在做一个角度应用程序,用于显示所选年份的生产计划。来自服务器的 json 数据被解析并绑定到模型,以便 angular 负责更改视图。
我已经用aspx编写了Web服务并序列化为
JavaScriptSerializer serializer = new JavaScriptSerializer();
json = serializer.Serialize(planData);
其中计划数据是类的列表
List<IPlan> planData = (List<IPlan>)HttpContext.Current.Session["PlanData"];
问题是可以序列化的字符数存在最大限制。
<jsonSerialization maxJsonLength="2147483647">
</jsonSerialization>
上述设置确定可以序列化的最大字符数。
因此,如果字符数大于允许值,我计划执行延迟加载。
如何在自定义类列表中找到字符数?
便宜、简单但保守的方法:
IPlan 中的属性是否有大小限制?通常他们会。构造 IPlan 的示例实例,每个属性都设置为其最大值。序列化它并获取其长度。现在将 maxJsonLength 除以您获得的长度,在最坏的情况下,这大约是您可以返回的最大项目数。如果 maxJsonLength 实际上设置为代码段中的值,则允许 2GB 的有效负载,这似乎比您在人类可读实体列表的实际应用中达到的要高得多。也许这个限制太高了?(这是另一个讨论(。
昂贵、愚蠢的方法(不推荐(
// opening '[' and closing ']' for JSON array
int serializedSize = 2;
for (int i = 0; i < plans.Length; i++)
{
if (i > 0)
{
// account for commas that occur between items
serializedSize++;
}
serializedSize += serializer.Serialize(plan).Length;
if (serializedSize > maxJsonLength)
{
// now you know where to stop
}
}
这很昂贵,因为您有效地执行了两次所有序列化 - 一次用于计算,一次用于实际响应。它也很脆弱,因为如果在数组的序列化中发生任何更改,则必须更改此代码。
最好采用第一种方法,并选择要返回的安全最大数量的项目,特别是如果您的限制确实是 2 场演出。
如果你有一个(类似(对象的列表,你可以序列化其中一个或几个,计算序列化的JSON字符串的大小,并通过外推估计完整列表的大小(作为JSON(。