我有一个名为TypedValue的JS类构造。它包括一个"基本类型"财产和价值"属性。基本类型是七种(目前)类型之一(表示为字符串):boolean,string,date,datetime,time,integer,decimal。
当我发送" TypedValue"到我的Web层,我正在寻找一种使用JSON的有效表示方法。我构建的任何表示的期望结果是它相对有效,并且在接收端,基本类型可以由web层重新确定。
字符串和布尔值没问题 - 可以发送它们" vanilla"。
JSON没有Date / DateTime / Time的特定表示,因此我们将它们编码为对象{type:" typename",value:" valuestring" }。
这给了我整数/小数基本类型。除了一个特殊情况,这些也可以发送给香草,这就是这个问题的原因:
如果我有一个基本类型整数的TypedValue,我可以将它作为vanilla JSON发送。接收方知道它是一个整数,因为没有发送小数点。
如果我有一个基本类型十进制的TypedValue,并且该值具有小数/小数部分,我可以将其作为vanilla JSON发送。接收方知道它是小数,因为数字中有小数点和小数部分。
这样就留下了一个TypedValue,它包含一个整数,但其基本类型是十进制的。例如,23。
如果我将值发送为23(JSON将如何对其进行编码),接收方将认为该数字的隐含基本类型是整数,而不是十进制。
解决方案当然是相当明显的:将数字发送为23.或23.0而不是23,因此接收方知道它是十进制数。
然而,这是我的问题的目的,我看不到实际实现这一点的方法,因为JSON序列化机制从未[似乎]让我控制原始值如何编码。
我可以在我的TypedValue类上编写一个toJSON()方法,但我只能返回一个不同的数据结构来序列化。我无法做到这一点:
我的"解决方法"目前是编码"整数十进制" as {type:" decimal",value:23}因此接收器被明确告知类型是小数,即使值"看起来像"整数。但该死的很难看,因为它是一个极端情况,所有其他数字案例都很好。
现在,我知道我可以编写我自己的序列化器,但我只是太强烈地感觉到它是一个" sledgehammer crack walnut"一种方法。这也意味着任何可能使用此API的人都会被迫进入相同的情况。理想情况下,我想找到一个简单的解决方案,它包含标准的JSON.stringify行为(如果可能的话)。
我知道有些人可能会问"你为什么要关心恢复基本类型"在网络层面上作为完全解决问题的手段,但我真的不希望这个问题是关于那个问题的。尽管如此,我将提供一个基本原理,即我们的JSON web api前端内部C#数据库API,并且该API需要正确类型的数据。换句话说,整数数据库字段需要整数数据类型,依此类推。对于我们的" JSON web api层"执行转换要求它了解数据库模式,否则C#Database API需要执行转换。除了我在这里提出的问题之外,这两个都在考虑之中。