微調一下 Json.net ,讓他可以序列基本型別

news/2024/7/3 12:25:48 标签: string, object, null, float, system, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

因為 Json.net 是有附原始碼的,他也附了單元測試的專案,底下是我額外增加的UnitTest,我的目標就是讓底下的測試可以pass,而且原來的Test 也要都能通過。

 

ValueTypeTest.cs

using System;
using NUnit.Framework;

namespace Newtonsoft.Json.Test {
[TestFixture]
public class ValueTypeTest {
[Test]
public void NullTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject(class="tags" href="/tags/NULL.html" title=null>null);
class="tags" href="/tags/OBJECT.html" title=object>object obj = JavaScriptConvert.DeserializeObject<Object>(jsonText);
Console.WriteLine(jsonText);
Assert.IsNull(obj);
}
[Test]
public void StringTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject("hello world");
class="tags" href="/tags/OBJECT.html" title=object>object obj = JavaScriptConvert.DeserializeObject<class="tags" href="/tags/OBJECT.html" title=object>object>(jsonText);
Console.WriteLine(jsonText);
Assert.AreEqual(obj, "hello world");
}
[Test]
public void IntegerTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject(1234);
int n = JavaScriptConvert.DeserializeObject<int>(jsonText);
Console.WriteLine(jsonText);
Assert.AreEqual(n, 1234);
}
[Test]
public void DateTimeTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject(new DateTime(2007, 7, 22, 12, 4, 55));
DateTime dtime = JavaScriptConvert.DeserializeObject<DateTime>(jsonText);
Console.WriteLine(jsonText);
Assert.AreEqual(dtime, new DateTime(2007, 7, 22, 12, 4, 55));
}
[Test]
public void BooleanTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject(true);
bool bVal = JavaScriptConvert.DeserializeObject<bool>(jsonText);
Console.WriteLine(jsonText);
Assert.AreEqual(bVal, true);
class="tags" href="/tags/STRING.html" title=string>string jsonText2 = JavaScriptConvert.SerializeObject(false);
bool bVal2 = JavaScriptConvert.DeserializeObject<bool>(jsonText2);
Console.WriteLine(jsonText2);
Assert.AreEqual(bVal2, false);
}
[Test]
public void FloatTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject(12345.68F);
class="tags" href="/tags/FLOAT.html" title=float>float fVal = JavaScriptConvert.DeserializeObject<class="tags" href="/tags/FLOAT.html" title=float>float>(jsonText);
Console.WriteLine(jsonText);
Assert.AreEqual(fVal, 12345.68F);
}
[Test]
public void EnumTest() {
class="tags" href="/tags/STRING.html" title=string>string jsonText = JavaScriptConvert.SerializeObject(StoreColor.White);
StoreColor color = JavaScriptConvert.DeserializeObject<StoreColor>(jsonText);
Console.WriteLine(jsonText);
Assert.AreEqual(color, StoreColor.White);
}
}
}
 

開始看code後,發現比想像中的簡單,失敗的原因是作者有檢查且擋掉,或許這不是 bug 而是 by design 吧

JsonSerializer.cs, line:406-407

修改前:
if (value == class="tags" href="/tags/NULL.html" title=null>null) 
    throw new ArgumentNullException("value");

修改後:
//if (value == class="tags" href="/tags/NULL.html" title=null>null)
//    throw new ArgumentNullException("value");

JsonWriter.cs, line 104

修改前:
/* Value */{ State.Error, State.Object, State.Error, State.Error, State.Array, State.Array, State.Error, State.Error },

修改後:
/* Value */{ State.Closed, State.Object, State.Error, State.Error, State.Array, State.Array, State.Error, State.Error },

 

http://www.niftyadmin.cn/n/1413537.html

相关文章

.Net 底下,Json 相關套件的限制

Json.Net 無法序列基本型別(string, int)&#xff0c;Asp.Net Ajax 無法正確序列日期&#xff0c;AjaxPro序列出我不想要的_type字串 1. Json.Net 是我最常使用的序列/反序列json套件&#xff0c;標榜速度快&#xff0c;對於一對多關係的object 也都能正常運作, 己能滿足我平日…

SpringBoot开发案例之打造私有云网盘

前言 最近在做工作流的事情&#xff0c;正好有个需求&#xff0c;要添加一个附件上传的功能&#xff0c;曾找过不少上传插件&#xff0c;都不是特别满意。无意中发现一个很好用的开源web文件管理器插件 elfinder&#xff0c;功能比较完善&#xff0c;社区也很活跃&#xff0c;还…

MySQL TOO BAD row's Range Lock Compare with PostgreSQL and Oracle

MySQL的InnoDB引擎&#xff0c;当UPDATE一个范围的数据时&#xff0c;会锁住比预期更多的ROW&#xff0c;而Oracle和PostgreSQL没有这种现象.来自《High Performance MySQL》一书。测试版本:MySQL 5.5.10PostgreSQL 9.0.2Oracle 10.2.0.4举例如下:1. MySQL (有索引的情况)Sessi…

数论——找新朋友 (欧拉函数)

新年快到了&#xff0c;“猪头帮协会”准备搞一个聚会&#xff0c;已经知道现有会员N人&#xff0c;把会员从1到N编号&#xff0c;其中会长的号码是N号&#xff0c;凡是和会长是老朋友的&#xff0c;那么该会员的号码肯定和N有大于1的公约数&#xff0c;否则都是新朋友&#xf…

Windows server 2003 QQ宠物猪伴侣出错解决办法

运行pigmate后&#xff0c;桌面什么都没有&#xff0c;右下角系统托盘也没有图标&#xff0c;在任务管理器里面倒是可以看到“猪猪伴侣”的条目&#xff0c;运行QQ宠物猪&#xff0c;也不见被伴侣托管 系统平台&#xff1a;enterprise server 2003 sp2 别人的解决方案&#xff…

vue从入门到进阶:渲染函数 JSX(八)

文章目录节点、树以及虚拟 DOMcreateElement 参数 深入 data 对象完整示例约束使用 JavaScript 代替模板功能 v-if 和 v-forv-model事件 & 按键修饰符插槽JSX函数式组件 slots() 和 children 对比Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML。然而在一些场景中…

Akka简单性能分析

因为最近工作的关系&#xff0c;要把异步任务从应用服务器中拆分到专门的异步处理服务器中。 方案一 是采用MQ的方式将任务消息发出&#xff0c;在服务端进行处理&#xff0c;这种方案是采用MQ作为中间的媒介&#xff0c;在服务端采用线程池异步处理任务&#xff0c;处理完成之…

数论——欧拉函数及欧拉打表

欧拉函数的功能&#xff1a;用于求小于n的与n互质数的个数 欧拉函数的作用&#xff1a;用于求小于n的与n互质数的个数 欧拉函数的公式&#xff1a; φ(n)n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn), 其中p1, p2……pn为n的所有质因数&#xff0c;n是不为0的整数。φ(1)…