导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

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是别的厂商接口返回的 无法去改那接口

...全文
305 点赞 收藏 13
写回复
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
麻烦各位老师指导下
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.