กำลังตรวจสอบ JToken ว่างหรือว่างใน JObject


93

ฉันมีดังต่อไปนี้ ...

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

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

JTokenToSql หน้าตาประมาณนี้ ...

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

ฉันได้ลองแล้ว((JObject)obj).Countด้วย .. แต่ดูเหมือนจะไม่ได้ผล

คำตอบ:


181

ในการตรวจสอบว่าคุณสมบัติมีอยู่บน a JObjectหรือไม่คุณสามารถใช้ไวยากรณ์วงเล็บเหลี่ยมและดูว่าผลลัพธ์เป็นโมฆะหรือไม่ หากคุณสมบัติมีอยู่JTokenจะส่งคืนa เสมอ (แม้ว่าจะมีค่าnullใน JSON ก็ตาม)

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

หากคุณมีJTokenอยู่ในมือและต้องการดูว่าว่างเปล่าหรือไม่ก็ขึ้นอยู่กับประเภทของJTokenมันและวิธีที่คุณกำหนดว่า "ว่าง" ฉันมักจะใช้วิธีการขยายดังนี้:

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
ฉันจะทำให้เป็นวิธีการขยายเช่น: IsNullOrEmpty บูลแบบคงที่สาธารณะ (โทเค็น JToken นี้) {... } เพื่อใช้เช่น JToken token = jObject ["param"]; bool empty = token.IsNullOrEmpty ()
Dmitry Pavlov

1
คุณไม่สามารถและตรวจสอบ? (หลังจากตรวจสอบแล้วว่าไม่เป็นโมฆะแน่นอน)ToSrtingJTokenIsNullOrWhiteSpaceJToken
สุ่ม

1
@CodeBlend นั่นจะใช้ไม่ได้กับออบเจ็กต์หรืออาร์เรย์ - เวอร์ชันที่ต่อเนื่องกันของสิ่งเหล่านั้นเมื่อว่างเปล่า{}และ[]ตามลำดับ
Brian Rogers

1
ฉันจะเพิ่มการตรวจสอบคุณสมบัติ: return (token == null) || (token.Type == JTokenType.Array &&! token.HasValues) || (token.Type == JTokenType.Object &&! token.HasValues) || (token.Type == JTokenType.String && โทเค็น ToString () == String.Empty) || (token.Type == JTokenType.Null) || (token.Type == JTokenType.Property && (โทเค็น (JProperty)) .Value ToString () == string.Empty);
jcmontx

64

คุณสามารถดำเนินการดังต่อไปนี้เพื่อตรวจสอบว่าค่า JToken เป็นโมฆะหรือไม่

JToken token = jObject["key"];

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

4
สิ่งที่ฉันกำลังมองหาเนื่องจากพารามิเตอร์ว่างส่งคืนประเภท null ที่ผ่านการเปรียบเทียบแบบปกติ == null ขอบคุณ!
Tim Tyler

5

นอกจากนี้ยังมีประเภท - JTokenType.Undefined

การตรวจสอบนี้จะต้องรวมอยู่ในคำตอบของ @Brian Rogers

token.Type == JTokenType.Undefined

1

ใน C # 7 คุณสามารถใช้สิ่งนี้:

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

ตัวดำเนินการ is จะตรวจสอบ Type และถ้าถูกต้องค่าอยู่ในตัวแปรไคลเอนต์


0

ลองทำสิ่งนี้เพื่อแปลง JToken เป็น 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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.