Json.NET IsValid โดยที่สคีมาส่งผ่านแม้ว่าจะไม่ตรงกันก็ตาม

ฉันมีสคีมา json ในร่าง -03 คุณสมบัติอย่างหนึ่งในนั้นเป็นเช่นนี้ -

"KeyToCheck": {
      "type": "array",
      "items": {
        "type": "object",
        "required": "true",
        "properties": {
          "property1": {
            "type": "string",
            "required": "true"
          },
          "property2": {
            "type": "string",
            "required": "true"
          },
          "property3": {
            "type": "number",
            "required": "true"
          },
          "property4": { "type": "array" }
        }
      },
      "required": "true"
    }

ฉันได้สมัครบังคับ - จริงสำหรับ KeyToCheck (ด้านล่างสุดที่จำเป็น - จริงใน json ข้างต้น อย่างไรก็ตามวิธีการ IsValid ยังคงผ่านแม้ว่าอาร์เรย์ KeyToCheck จะว่างเปล่าในการตอบกลับ วิธีการนี้ใช้ในลักษณะนี้ - Jtoken.parse (ตอบกลับ) .isvalid(สคีมา)


person GameFromScratch    schedule 01.08.2019    source แหล่งที่มา


คำตอบ (1)


ปัญหาคือในสคีมา JSON ของคุณ คุณไม่ได้ตรวจสอบความยาวของอาร์เรย์ KeyToCheck คุณสามารถใช้คุณสมบัติ minItems เพื่อกำหนดขอบเขตล่างของอาร์เรย์ ลองทำตามสคีมา JSON หวังว่ามันจะได้ผล

{
  "$schema": "http://json-schema.org/draft-03/schema#",
  "type": "object",
  "properties": {
    "KeyToCheck": {
      "type": "array",
      "required": true,
      "minItems": 1,
      "items": {
        "type": "object",
        "required": true,
        "properties": {
          "property1": {
            "type": "string",
            "required": true
          },
          "property2": {
            "type": "string",
            "required": true
          },
          "property3": {
            "type": "number",
            "required": true
          },
          "property4": {
            "type": "array"
          }
        }
      }
    }
  }
}

อินพุต JSON:

{
 "KeyToCheck":[]
}

ผลการตรวจสอบ:

ข้อความ: จำนวนรายการอาร์เรย์ 0 น้อยกว่าจำนวนขั้นต่ำ 1 เส้นทางสคีมา: #/properties/KeyToCheck/minItems

แก้ไข:

หากต้องการตรวจสอบอาร์เรย์ที่ไม่ว่างเปล่าให้ใช้สคีมานี้

{
  "$schema": "http://json-schema.org/draft-03/schema#",
  "type": "object",
  "properties": {
    "KeyToCheck": {
      "type": "array",
      "required": true,
      "maxItems": 0
    }
  }
}

อินพุต JSON:

{
 "KeyToCheck":["test_value"]
}

ผลการตรวจสอบ:

ข้อความ: จำนวนรายการอาร์เรย์ 1 เกินจำนวนสูงสุด 0 เส้นทางสคีมา: #/properties/KeyToCheck/maxItems

person lahiruk    schedule 07.08.2019
comment
ในกรณีของฉัน ปัญหาคือว่า Array KeyToCheck ควรว่างเปล่าจริง ๆ แต่ความจริงที่ว่าความต้องการจริงไม่ได้ล้มเหลวนั่นคือปัญหา ฉันควรใช้ maxItems:0 สำหรับสิ่งนี้หรือไม่ เพื่อให้แน่ใจว่าไม่มีรายการในอาร์เรย์ KeyToCheck? - person GameFromScratch; 08.08.2019
comment
ฉันสับสนเล็กน้อยเกี่ยวกับความต้องการของคุณตอนนี้ คุณต้องการส่งผ่านการตรวจสอบเมื่ออาร์เรย์ KeyToCheck ว่างเปล่าหรือไม่? นอกจากนี้ คีย์เวิร์ด required ไม่เกี่ยวข้องกับขนาดอาร์เรย์ ตรวจสอบความพร้อมใช้งานของฟิลด์ JSON เท่านั้น และจะล้มเหลวเฉพาะเมื่อฟิลด์ KeyToCheck ไม่พร้อมใช้งานในอินพุต JSON - person lahiruk; 08.08.2019
comment
ดังนั้นสิ่งที่ฉันต้องการคือการตอบสนองนั้น อาร์เรย์ KeyToCheck ควรว่างเปล่า ดังนั้นฉันจึงตรวจสอบโดยบังเอิญครั้งหนึ่งว่า required:true would failed it แต่ก็ไม่ได้เป็นเช่นนั้น นั่นทำให้ฉันกังวล ฉันคิดว่า required:true จะตรวจสอบว่ามีวัตถุอย่างน้อยหนึ่งรายการในอาร์เรย์ ดังนั้นเพื่อกำหนดกรอบคำถามของฉันใหม่ - ฉันจะแน่ใจได้อย่างไรว่าอาร์เรย์ว่างเปล่าในการตอบสนองและไม่ผ่านการตรวจสอบหากไม่เป็นเช่นนั้น ขอโทษสำหรับความสับสน. - person GameFromScratch; 08.08.2019
comment
จากนั้นคุณสามารถใช้ "maxItems": 0 สำหรับการตรวจสอบนี้ แต่โปรดทราบว่า items คำจำกัดความในสคีมาจะไม่สมเหตุสมผล ดังนั้นคุณควรลบออก - person lahiruk; 08.08.2019
comment
ตกลง ดังนั้นถ้าฉันไม่มีคำจำกัดความ 'รายการ' มันจะล้มเหลวหรือไม่หาก KeyToCheck ไม่ว่างเปล่า - person GameFromScratch; 08.08.2019
comment
ใช่. คุณสามารถทดสอบสคีมาของคุณได้ที่นี่ jsonschemavalidator.net - person lahiruk; 09.08.2019