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

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

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

JObject/JArray处理日期时间字符串的问题_第1张图片

转换为JObject以后输出:

JObject/JArray处理日期时间字符串的问题_第2张图片

 我们可以看到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");

你可能感兴趣的:(json,JObject,JArray,NewtonJson)