【问题标题】:Issue with JSON null handling in NewtonsoftNewtonsoft 中的 JSON 空处理问题
【发布时间】:2021-03-09 06:29:37
【问题描述】:

我在处理Newtonsoft.json 时遇到了null 处理问题。

我想检查结果是不是null。基于此,我想处理一些条件。

我的代码如下:

try {
    var response = GetApiData.Post(_getApiBaseUrl, data.ToString());

    var jsonString = response.ResultString;
    var jsonContent = JObject.Parse(jsonString);

    if (jsonContent["User"] != null)  // <-- null handling                 
    {
        var user = JToken.Parse(jsonContent["User"].ToString());
        membershipUser = GetMembershipUser(user);
    }
}

jsonContentnull 如下:

{
     "User": null
}

如果"User": null jsonContent["User"] 返回{}jsonContent["User"] != null 条件没有抛出任何错误,但不是跳过块,而是执行内部行。

所以对于null 处理,我使用了这段代码:

if (jsonContent["User"].Value<string>() != null)

如果是"User": null,上面的代码可以正常工作。

但如果jsonContent["User"] 有有效数据,则会抛出错误。

无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken

jsonContent的有效数据如下:

{
    "User": {
        "Claims": [],
        "Logins": [],
        "Roles": [],
        "FirstName": "Unknown",
        "LastName": "Unknown",
        "IsApproved": true,
        "IsDeleted": false,
        "Email": "testuser@user.com",
        "EmailConfirmed": false,
        "PasswordHash": "AC/qXxxxxxxxxx==",
        "SecurityStamp": "001f3500-0000-0000-0000-00f92b524700",
        "PhoneNumber": null,
        "PhoneNumberConfirmed": false,
        "TwoFactorEnabled": false,
        "LockoutEndDateUtc": null,
        "LockoutEnabled": false,
        "AccessFailedCount": 0,
        "Id": "00f50a00-0000-0000-0000-000b97bf2800",
        "UserName": "testUser"
    }
}   

如何使用有效数据和空值实现这种空值处理?

【问题讨论】:

    标签: json null json.net


    【解决方案1】:

    您可以检查JToken.Type 是否为JTokenType.Null

    var jsonContent = JObject.Parse(jsonString);
    var user = jsonContent["User"];
    if (user != null && user.Type != JTokenType.Null)
    {
        membershipUser = GetMembershipUser(user);
    }
    

    为了方便检查,可以引入扩展方法:

    public static partial class JTokenExtensions
    {
        public static bool IsNull(this JToken token)
        {
            return token == null || token.Type == JTokenType.Null;
        }
    }
    

    然后做:

    if (!user.IsNull())
    {
        membershipUser = GetMembershipUser(user);
    }
    

    【讨论】:

    • JTokenType.Null 是一个不错的功能。它按预期工作。
    【解决方案2】:

    我添加以扩展上面 dbc 的答案,因为我发现了一个 JToken 被字符串变量分配给 null 的情况。此时 JTokenType 为 JTokneType.String,但值仍为 null。

    using Newtonsoft.Json.Linq;
    
    namespace Common
    {
        public static class JTokenExtensions
        {
    
            public static bool IsNull(this JToken token)
            {
                if (token == null || token.Type == JTokenType.Null)
                {
                    return true;
                }
    
                // Catch the case where a user uses a NULL string variable to set the JToken to null
                // If it was directly assigned to a null, the test above will work; however, if you
                // set the JToken with a string variable that is null, you need this test!
                if (token.Type == JTokenType.String)
                {
                    string result = token.Value<string>();
                    if (result == null)
                    {
                        return true;
                    }
                }
    
                return false;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多