Json.NET特殊处理64位长整型数据

简介:

  很多ASP.NET项目,尤其是使用了Ajax的项目,常常需要返回JSON格式的数据。.NET框架从3.5版本开始提供了JSON的序列化和反序列化工具,不过个人感觉不太好用,后来找了第三方的Newtonsoft.Json来用。再后来,在MVC4中,微软已经默认使用Json.NET(Newtonsoft.Json)来处理JSON数据了。


  JavaScript数值精度是32位,如果整数数度超过32位,就会被当作浮点数处理。换句话说,如果从服务端生成的JSON,某个值是64位整数,传到前端JavaScript,再传回服务端,不做任何运算,都可能出现失真。做个实验:


1
2
3
var  a = 123456789012345678
> console.log(a);
123456789012345680


  很要命的一点是,数据库设计中常常会用bigint(64位)整数来作为主键,是一个非常重要而且不能有偏差的数据,比如,一个模型:


1
2
3
4
5
// C# 匿名对象
new  {
     id: 123456789012345678L,
     name:  "James"
};


  转换成JSON输出到前端是:


1
{ "id" :123456789012345678, "name" : "James" }


  通过Ajax取得的对象输出就有点不妙了


1
2
3
4
$.getJSON( "/api/test" ).done( function (jo) {
     console.log(jo);
});
// Object {id: 123456789012345680, name: "James"}


  显然,这个对象修改数值之后再传回服务器,就会找不到主键,或者更新成错误的数据,造成一个不易发现的巨大BUG。


  解决办法当然是有的,JavaScript处理字符串的能力非常强,完全可以把服务器端的64位整数处理成字符串类型。不过 Json.NET 默认是把 long 处理成 number 类型的,如果要处理成 string 类型,需要自定义一个JsonConverter。


  考虑到用十六进制表示的整数看起来比较整齐,所以定义一个HexLongConverter来转换long/ulong型数据与16进制表示的字符串。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public  class  HexLongConverter : JsonConverter
{
     public  override  void  WriteJson(JsonWriter writer,  object  value, JsonSerializer serializer)
     {
         // 由于CanConvert过滤,数据类型只可能是long或ulong
         // 统一转换成long类型处理
         long  v = value  is  ulong  ? ( long )( ulong )value : ( long )value;
         writer.WriteValue(v.ToString( "X16" ));
     }
     public  override  object  ReadJson(JsonReader reader, Type objectType,  object  existingValue, JsonSerializer serializer)
     {
         // 取得读到的十六进制字符串
         string  hex = reader.Value  as  string ;
         // 调用ToInt64扩展将字符串转换成long型
         // ToInt64扩展方法后附
         long  v = hex.ToInt64(NumberStyles.HexNumber, 0L);
         // 将v转换成实际需要的类型 ulong 或 long(不转换)
         return  typeof  ( ulong ) == objectType ? ( object ) ( ulong ) v : v;
     }
     public  override  bool  CanConvert(Type objectType)
     {
         // 只处理long和ulong两种类型的数据
         switch  (objectType.FullName)
         {
             case  "System.Int64" :
             case  "System.UInt64" :
                 return  true ;
             default :
                 return  false ;
         }
     }
}


  上面的代码用到了一个string的扩展方法ToInt32:


1
2
3
4
5
6
7
8
9
public  static  class  StringExtention
{
     public  static  int  ToInt32( this  string  me, NumberStyles style,
         int  defaultValue)
     {
         int ? value = me.ToInt32(style);
         return  value ==  null  ? defaultValue : value.Value;
     }
}


  在序列化或反序列化模型的时候,只需要加入HexLongConverter对象作为参数即可:


1
2
3
4
// 序列化
string  json = JsonConvert.SerializeObject(model,  new  HexLongConverter());
// 反序列化
SomeModal model = JsonConvert.DeserializeObject<model>(json,  new  HexLongConverter));


本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/1409149,如需转载请自行联系原作者
相关文章
|
19天前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
29天前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
99 0
|
29天前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
55 0
|
29天前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
59 0
|
2月前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
167 83
|
2天前
|
JSON Java 数据库连接
怎样用 esProc 计算来自 Restful 的多层 json 数据
esProc 是一款强大的数据处理工具,可简化 Java 处理 Restful 接口返回的复杂多层 JSON 数据的难题。通过 esProc,不仅能轻松访问和解析 Restful 数据,还能高效完成复杂计算任务,并可无缝嵌入 Java 应用中作为计算引擎使用。例如,筛选特定分类订单或计算金额,esProc 的脚本简洁直观,远优于传统 SQL 或纯 Java 实现。此外,esProc 支持安全认证(如 Cookie 和 Token)及 JDBC 集成,为开发者提供灵活高效的解决方案。
|
5天前
|
JSON JavaScript 数据格式
何如定义 JSON Schema 并验证该 json 数据?
本文定义了一个包含 audio 和 tags 两个必需属性的 JSON Schema,用于规范数据结构。其中,audio 是非空字符串,表示音频组件;tags 是非空数组,表示标签组件。通过示例数据和验证工具(如 ajv, NJsonSchema),可确保 JSON 数据符合 Schema 要求,从而保障数据的一致性和正确性。
60 1
|
1月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
154 4
JSON数据解析实战:从嵌套结构到结构化表格
|
12天前
|
网络协议 定位技术 网络安全
IPIP.NET-IP地理位置数据
IPIP.NET 是一家专注于 IP 地理位置数据的提供商,基于 BGP/ASN 数据与全球 800+ 网络监测点技术,提供高精度的 IPv4 和 IPv6 定位服务。其核心服务包括地理位置查询、详细地理信息和网络工具等,广泛应用于网络安全、广告营销、CDN 优化等领域。数据覆盖全球,支持多语言,每日更新确保实时性。IPIP.NET 提供 API 接口、离线数据库及多种语言 SDK,方便开发者集成使用。
88 0
|
1月前
|
JSON 监控 API
python语言采集淘宝商品详情数据,json数据示例返回
通过淘宝开放平台的API接口,开发者可以轻松获取商品详情数据,并利用这些数据进行商品分析、价格监控、库存管理等操作。本文提供的示例代码和JSON数据解析方法,可以帮助您快速上手淘宝商品数据的采集与处理。

热门文章

最新文章