【问题标题】:How to determine length of JSON representation before serialization如何在序列化之前确定 JSON 表示的长度
【发布时间】:2014-12-19 04:58:45
【问题描述】:

我正在做一个角度应用程序来显示所选年份的生产计划。 来自服务器的 json 数据被解析并绑定到模型,以便 Angular 负责更改视图。

我已经用aspx编写了web服务并序列化为

JavaScriptSerializer serializer = new JavaScriptSerializer();
json = serializer.Serialize(planData);

其中 planData 是类列表

  List<IPlan> planData = (List<IPlan>)HttpContext.Current.Session["PlanData"];

问题是可以序列化的字符数有一个最大限制。

<jsonSerialization maxJsonLength="2147483647">
</jsonSerialization>

以上设置决定了可以序列化的最大字符数。

所以我打算在字符数大于允许的情况下执行延迟加载。

如何查找自定义类列表中的字符数?

【问题讨论】:

  • 更好的标题:确定JSON表示的长度之前序列化
  • @DrKoch Chnaged。感谢您的建议
  • 你有没有计算过一个小的 planData 中的字符,并在达到 2147483647 之前估计它可以大多少?
  • @DrKoch。不,我不知道如何遍历列表并获取字符数
  • 请举例说明 IPlan,其成员的典型尺寸是多少?

标签: c# json angularjs


【解决方案1】:

廉价、简单但保守的方法:

IPlan 中的属性是否有大小限制?通常他们会。构造 IPlan 的示例实例,将每个属性设置为其最大值。序列化它并获得它的长度。现在将 maxJsonLength 除以您得到的长度,这大约是您可以返回的最大项目数,在最坏的情况下。如果 maxJsonLength 实际上设置为您在 sn-p 中的值,则允许 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 gigs。

【讨论】:

  • 不确定.Length 是否正确,因为字符串长度和字节大小可能不同。
【解决方案2】:

如果您有一个(相似的)对象列表,您可以序列化其中的一个或几个,计算序列化 JSON 字符串的大小并通过外推估计完整列表(如 JSON)的大小。

【讨论】:

  • 不会有类似的对象,因为列表中每个项目的字符值不同(每天计划)
  • 为什么不总是延迟加载?或者只是总是添加较少数量的项目并延迟加载其余项目。不能统计每天的物品?按天加载,而不是一次全部加载?
  • @Robert_Junior 他说相似不是“相同”,它基本上是“大数规则”的应用如果样本代表集合,您可以使用样本的平均大小作为集合的平均大小
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多