JObject/JArray处理日期时间字符串的问题

        以WebApi为例,我们在使用JObject/JArray作为Controller入参时,会把接收到的Json字符串转换为JObject/JArray对象,这个转换在处理日期时间字符时会转换为DateTime进行处理,会使用操作系统日期格式进行转换。比如如下Json字符串

{"firstName": "John","lastName" : "doe","createTime"   : "2023-04-07 07:12:02"
}

转换为JObject以后输出:

 我们可以看到createTime值已经从

2023-04-07 07:12:02

变为了

2023-04-07T07:12:02

可以看到JObject/JArray处理Json字符串时并不是把日期时间字符串值当做string来处理的,而是转换为了DateTime类型进行处理,这就导致了输入和输出格式不一致的问题

在使用时需要注意,如果需要还原为原格式,还需要进行格式化处理:


var createTimeStr = input.SelectToken("createTime")?.Value().ToString("yyyy-MM-dd HH:mm:ss");

 或者在将Json字符串转换为JObject/JArray时,使用Load方法不对日期时间字符串进行处理:

/// /// Json字符串转换为JObject(日期时间字符串不进行DateTime类型转换)/// /// json字符串/// public static JObject ParseToJObject(string jsonString){using (var reader = new JsonTextReader(new StringReader(jsonString))){reader.DateParseHandling = DateParseHandling.None;var jObj = JObject.Load(reader);return jObj;}}/// /// Json字符串转换为JArray(日期时间字符串不进行DateTime类型转换)/// /// json字符串/// public static JArray ParseToJArray(string jsonString){using (var reader = new JsonTextReader(new StringReader(jsonString))){reader.DateParseHandling = DateParseHandling.None;var jArray = JArray.Load(reader);return jArray;}}

-----我是华丽的分割线-----------------------------------------------------------

这里补充一个SelectToken的使用注意事项:

SelectToken只有在选择的属性在json中不存在时才会为null,其他情况值是不为null的。

比如,有以下一个jsonStr:

{
  "firstName": "John",
  "lastName" : null,
  "age"      : 26,
  "joinTime"      : "2023-04-25 10:01:03",
  "address"  : {
    "streetAddress": "naist street",
    "city"         : "Nara",
    "postalCode"   : "630-0192"
  }
}

var jsonStr = "{\r\n  \"firstName\": \"John\",\r\n  \"lastName\" : null,\r\n  \"age\"      : 26,\r\n  \"address\"  : {\r\n    \"streetAddress\": \"naist street\",\r\n    \"city\"         : \"Nara\",\r\n    \"postalCode\"   : \"630-0192\"\r\n  }\r\n}";
var jObj = JObject.Parse(jsonStr);
Console.WriteLine(jObj.SelectToken("lastName") == null);//false
Console.WriteLine(jObj.SelectToken("nickName") == null);//true

nickName属性不存在,所以此时SelectToken才为null,如果所选属性存在值必然不为null,与所选属性的值无关。

使用SelectToken处理属性值可能为空的字段时可以使用可空类型。

如:

string a = ((DateTime?)item.SelectToken("joinTime"))?.ToString("yyyy-MM-dd");


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部