在Newtonsoft中使用JSON null处理的问题

Aru*_*mar 2 null json json.net

null在交易时遇到问题Newtonsoft.json.

我想查看结果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);
    }
}
Run Code Online (Sandbox Code Playgroud)

jsonContentnull是如下:

{
     "User": null
}
Run Code Online (Sandbox Code Playgroud)

如果"User": nulljsonContent["User"]回报{}jsonContent["User"] != null条件没有抛出任何错误,而是跳越块,它执行内部线路.

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

if (jsonContent["User"].Value<string>() != null)
Run Code Online (Sandbox Code Playgroud)

如果"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"
    }
}   
Run Code Online (Sandbox Code Playgroud)

如何使用有效数据和空值来实现此null处理?

dbc*_*dbc 6

你可以检查JToken.TypeJTokenType.Null:

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

为了使检查更方便,可以引入一种扩展方法:

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

然后做:

if (!user.IsNull())
{
    membershipUser = GetMembershipUser(user);
}
Run Code Online (Sandbox Code Playgroud)