NewtonSoft 反序列化JSON 里的NULL如何处理

nb20022 2020-07-10 12:44:35
json的string 这样 { "errcode" : "0",
"errmsg" : SUCCESS",
"responseObject" :{ "result" :[{ "sjmj" : "ABCD",
"zzmmzw" : NULL,
}], "total" : 39 }}

部分代码如下
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Headers.Set("userKey", "vsc30r8f");
request.Proxy = null;
request.KeepAlive = false;
request.Method = "GET";
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();

StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
用 Object jObj111 = JsonConvert.DeserializeObject(retString ); 或者 JObject jObj111 = JObject.Parse(retString )
都抛异常 "Newtonsoft.Json.JsonReaderException: Error parsing NaN value" 请问这个NULL 怎么处理
或者用
var errors = new List<string>();
var data11 = JsonConvert.DeserializeObject<JObject>(retString ,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Include,
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs earg)
{
errors.Add(earg.ErrorContext.Member.ToString());
earg.ErrorContext.Handled = true;
}
});
也抛异常“System.NullReferenceException: 未将对象引用设置到对象的实例"
这个JSON是别的厂商接口返回的 无法去改那接口

...全文
2124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nb20022 2020-07-10
  • 打赏
  • 举报
回复
json的string 这样 { "errcode" : "0", "errmsg" : "SUCCESS", "responseObject" :{ "result" :[{ "sjmj" : "ABCD", "zzmmzw" : NULL, }], "total" : 39 }}
nb20022 2020-07-10
  • 打赏
  • 举报
回复
写的头脑发昏了 没赋值 不好意思 谢谢啊
nb20022 2020-07-10
  • 打赏
  • 举报
回复
ajdkjalj 2020-07-10
  • 打赏
  • 举报
回复
引用 8 楼 nb20022 的回复:
按老师的意思已经修改代码 大致如下 public class Rootobject { public string errcode { get; set; } public string errmsg { get; set; } public Responseobject responseObject { get; set; } } public class Responseobject { public Result[] result { get; set; } public int total { get; set; } } public class Result { public string sjmj { get; set; } public object zzmmzw { get; set; } } var data1111 = JsonConvert.DeserializeObject<Rootobject>(retString); 但是还是报异常 Error parsing NaN value. Path 'responseObject.result[0].zzmmzw
让你把大写的NULL替换成null呢
by_封爱 版主 2020-07-10
  • 打赏
  • 举报
回复
一点调试的能力都丧失了?
nb20022 2020-07-10
  • 打赏
  • 举报
回复
字符串.Replace("NULL", "null"); 试了下 这个大写NULL 替换不掉
nb20022 2020-07-10
  • 打赏
  • 举报
回复
按老师的意思已经修改代码 大致如下 public class Rootobject { public string errcode { get; set; } public string errmsg { get; set; } public Responseobject responseObject { get; set; } } public class Responseobject { public Result[] result { get; set; } public int total { get; set; } } public class Result { public string sjmj { get; set; } public object zzmmzw { get; set; } } var data1111 = JsonConvert.DeserializeObject<Rootobject>(retString); 但是还是报异常 Error parsing NaN value. Path 'responseObject.result[0].zzmmzw
nb20022 2020-07-10
  • 打赏
  • 举报
回复
使用创建实体类方法 分别如下 public class Response { public string errcode { get; set; } public string errmsg { get; set; } public Result responseObject { get; set; } } public class Result { public List<PersonList> result { get; set; } public string total { get; set; } } public class PersonList { public string sjmj { get; set; } public string zzmmzw { get; set; } } var data1111 = JsonConvert.DeserializeObject<Response>(retString ); 仍旧异常 “Error parsing NaN value. Path 'responseObject.result[0].zzmmzw”
by_封爱 版主 2020-07-10
  • 打赏
  • 举报
回复
我们来看下下面的代码

int? i= null;
var obj = new { a = i };
Console.WriteLine(GetJson(obj));
这个时候输出的json也就是

 {"a":null}
所以 大写的NULL 似乎在.net下不可用..第三方工具都无法识别.. 甚至vs自带的"选择性粘贴"都报错.. 既然对方无法更改,那你只能replace了..我觉得没别的办法.
疋疋 2020-07-10
  • 打赏
  • 举报
回复
引用 1 楼 nb20022 的回复:
json的string 这样 { "errcode" : "0", "errmsg" : "SUCCESS", "responseObject" :{ "result" :[{ "sjmj" : "ABCD", "zzmmzw" : NULL, }], "total" : 39 }}
实际上好像是因为这个NULL 值不是标准的null ,而是大写而导致无法进行识别吧
by_封爱 版主 2020-07-10
  • 打赏
  • 举报
回复
大写的NULL似乎有问题...就算定义成class也无法解析.. 所以找到了一个独特的方法.. 先把json.replace("NULL","null"); 然后就可以使用jobject 或者定义成class

 public class Rootobject
        {
            public string errcode { get; set; }
            public string errmsg { get; set; }
            public Responseobject responseObject { get; set; }
        }

        public class Responseobject
        {
            public Result[] result { get; set; }
            public int total { get; set; }
        }

        public class Result
        {
            public string sjmj { get; set; }
            public object zzmmzw { get; set; }
        }

  var json = "{\"errcode\" : \"0\",\"errmsg\" : \"SUCCESS\",\"responseObject\" :{\"result\" :[{\"sjmj\" : \"ABCD\",\"zzmmzw\" : null,}], \"total\" : 39 }}";
 var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(json);
 Console.WriteLine(obj);
疋疋 2020-07-10
  • 打赏
  • 举报
回复
反序列化没有你想像的那么复杂。 你先创建一个实体类,结构就按照你的这个json 格式标准来创建 { "errcode" : "0", "errmsg" : "SUCCESS", "responseObject" :{ "result" :[{ "sjmj" : "ABCD", "zzmmzw" : NULL, }], "total" : 39 }} JsonConvert.DeserializeObject<你创建的实体类>(); 直接用这个进行反序列化,无需针对null 做特殊处理。
nb20022 2020-07-10
  • 打赏
  • 举报
回复
麻烦各位老师指导下
jquery的treeview 在显示大层次树是会卡死浏览器,我结合http://www.cnblogs.com/xuanye/archive/2009/10/26/1590250.html的改进版做的这个改进版(因为很多人没读他的源码,不知道怎么请求节点的处理页面),把asp.net的json序列化 都做了进去(Newtonsoft.jsonnet2.0.dll),,采用ajax+wrapperpage+usercontrol的模式生成json(因为牵涉公司两个配置文件,必须读配置信息连接数据库,绕了一下其实可以更轻量级的handler来处理,例子不能运行,但可以看看),同时扩展了很多的配置项都有说明,希望对大家有帮助 使用例如: <script src="lib/jquery/jquery.js" type="text/javascript"> <script src="lib/jquery/plugins/treeview/js/common.js" type="text/javascript"> <script type="text/javascript"> var checknodes = "HJH8,HJA5"; //你事先要传给树控件的 已选中节点 id $(document).ready(function() { var o = { isAsync: false, //是否异步获取节点,根据咱的要求 设为false url: "AjaxWrapperPages/AsyncGetTreeNodes.aspx", //请求节点的页面,如果没有改变文件路径 不用关心 cbiconpath: "lib/jquery/plugins/treeview/images/icons/", //同上 checkbox icon的目录位置 //icons: ["checkbox_0.gif", "checkbox_1.gif", "checkbox_2.gif"],//不用配置 emptyiconpath: "lib/jquery/plugins/treeview/images/s.gif", //checkbxo三态的图片 animate: true, //不用配置,动画没有效果 theme: "bbit-tree-lines", //bbit-tree-lines ,bbit-tree-no-lines,bbit-tree-arrows有线、没线、箭头 三个样式中选择 showcheck: true //是否显示复选框 , checkNodes: checknodes //上面 你事先要传给树控件的 已选中节点 id的变量 , rootText: "中石化单位"//根节点的文本 可为空 则没有根节点 建议起个有意义的名字描述这棵树 //,onnodeclick: function(item) { alert(item.text); } , dbconfigPath: "~/hanwayDbConfig.hwdb" //可去掉,这是我做测试用 可不用此配置 , conStr: "conStr" //连接字符串 你可直接传,考虑安全 可不用此配置 /************ 必填项 ****************/ , sqlPath: "~/Db.hwSql" //sql语句存放的文件位置 , sqlID: "dwdyinfo" //sql对应的sqlid , dtFields: "dm,zhdm,mc" //表的结构 控件之关心3个:“主键id 外(父)键id 节点文本” 依次','分开 , pnodeMark: "dyzhgx" //和上面的dtFields中的外键 用来构造过滤条件 如"zhdm='dyzhgx'" 查询出所有一级节点 }; $("#tree").treeview(o); //到服务器处理选中节点 $("#showchecked").click(function(e) { var changnodes = $("#tree").getTSVs(); //得到所有选中节点的id if (changnodes != null) { changnodes = changnodes.join(","); $.ajax({ type: "get", url: "some.aspx", data: "nodes="+changnodes, success: function(msg) { alert("Data Saved: " + msg); } }); } });

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧