Kiểm tra JToken trống hoặc rỗng trong JObject


90

Tôi có những thứ sau ...

JArray clients = (JArray)clientsParsed["objects"];

foreach (JObject item in clients.Children())
{
    // etc.. SQL params stuff...
    command.Parameters["@MyParameter"].Value = JTokenToSql(item["thisParameter"]);
}

JTokenToSql trông như thế này ...

public static object JTokenToSql(JToken obj)
{
    if (obj.Any())
        return (object)obj;
    else
        return (object)DBNull.Value;
}

Tôi cũng đã thử ((JObject)obj).Count.. Nhưng dường như không hiệu quả.

Câu trả lời:


176

Để kiểm tra xem một thuộc tính có tồn tại trên a hay không JObject, bạn có thể sử dụng cú pháp dấu ngoặc vuông và xem liệu kết quả có là null hay không. Nếu thuộc tính tồn tại, a JTokensẽ luôn được trả về (ngay cả khi nó có giá trị nulltrong JSON).

JToken token = jObject["param"];
if (token != null)
{
    // the "param" property exists
}

Nếu bạn có JTokentrong tay và bạn muốn xem nó có trống không, thì điều đó phụ thuộc vào loại JTokennó là gì và cách bạn định nghĩa "rỗng". Tôi thường sử dụng một phương pháp mở rộng như sau:

public static class JsonExtensions
{
    public static bool IsNullOrEmpty(this JToken token)
    {
        return (token == null) ||
               (token.Type == JTokenType.Array && !token.HasValues) ||
               (token.Type == JTokenType.Object && !token.HasValues) ||
               (token.Type == JTokenType.String && token.ToString() == String.Empty) ||
               (token.Type == JTokenType.Null);
    }
}

1
Tôi sẽ đặt nó thành phương thức mở rộng như: public static bool IsNullOrEmpty (mã thông báo JToken này) {...} để sử dụng như JToken token = jObject ["param"]; bool blank = token.IsNullOrEmpty ()
Dmitry Pavlov

1
Có thể bạn không ToSrtingnhững JTokenvà kiểm tra IsNullOrWhiteSpace? (Sau khi kiểm tra JTokenkhông phải là null tất nhiên)
Coops

1
@CodeBlend Điều đó sẽ không hoạt động đối với một đối tượng hoặc một mảng - các phiên bản được tuần tự hóa của chúng khi trống là {}[]tương ứng.
Brian Rogers

1
Tôi sẽ thêm Kiểm tra thuộc tính: return (mã thông báo == null) || (token.Type == JTokenType.Array &&! token.HasValues) || (token.Type == JTokenType.Object &&! token.HasValues) || (token.Type == JTokenType.String && token.ToString () == String.Empty) || (token.Type == JTokenType.Null) || (token.Type == JTokenType.Property && ((JProperty) token) .Value.ToString () == string.Empty);
jcmontx

59

Bạn có thể tiến hành như sau để kiểm tra xem Giá trị JToken có rỗng không

JToken token = jObject["key"];

if(token.Type == JTokenType.Null)
{
    // Do your logic
}

3
Chính xác những gì tôi đang tìm kiếm, do các tham số rỗng trả về kiểu null vượt qua so sánh == null điển hình. Cảm ơn!
Tim Tyler

4

Ngoài ra còn có một loại - JTokenType.Undefined.

Kiểm tra này phải được bao gồm trong câu trả lời của @Brian Rogers.

token.Type == JTokenType.Undefined

1

Kể từ C # 7, bạn cũng có thể sử dụng cái này:

if (clientsParsed["objects"] is JArray clients) 
{
    foreach (JObject item in clients.Children())
    {
        if (item["thisParameter"] as JToken itemToken) 
        {
            command.Parameters["@MyParameter"].Value = JTokenToSql(itemToken);
        }
    }
}

Toán tử là kiểm tra Loại và nếu nó đúng thì Giá trị nằm bên trong biến khách hàng.


0

Hãy thử một cái gì đó như sau để chuyển đổi JToken thành JArray:

static public JArray convertToJArray(JToken obj)
{
    // if ((obj).Type == JTokenType.Null) --> You can check if it's null here

    if ((obj).Type == JTokenType.Array)
        return (JArray)(obj);
    else
        return new JArray(); // this will return an empty JArray
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.