jsonSchema বৈশিষ্ট্য শর্তসাপেক্ষে প্রয়োজনীয়


104

JsonSchema এ আপনি নির্দেশিত ক্ষেত্রগুলি বাধ্যতামূলক কিনা বা requiredবৈশিষ্ট্যটি ব্যবহার করা হচ্ছে না তা নির্দেশ করতে পারেন :

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "header": {
            "type": "object",
            "properties": {
                "messageName": {
                    "type": "string"
                },
                "messageVersion": {
                    "type": "string"
                }
            },
            "required": [
                "messageName",
                "messageVersion"
            ]
        }
    },
    "required": [
        "header"
    ]
}

নির্দিষ্ট কিছু ক্ষেত্রে, আমি messageVersionক্ষেত্রটি বাধ্যতামূলক না হওয়া চাই । এই ক্ষেত্রটির বাধ্যতামূলক-নেসকে শর্তযুক্ত করার কোনও উপায় আছে কি?


হ্যাঁ, এটি সম্ভব হওয়া উচিত। ডেটাতে কোন তথ্য বাধ্যতামূলক-নেসকে ট্রিগার করবে?
jruizaranguren

@ সার্ভেস্বরণমীনাক্ষীসুন্দরাম - আমি জানি না আমি কেবল জেএসন স্কিমা v4 ব্যবহার করেছি
টম redfern

সংস্করণ 3 এ কি আদৌ সম্ভব?
সর্বেশ

@ সার্ভেস্বরণমীনাক্ষীসুন্দরাম - আমি জানি না। এটি চেষ্টা করুন এবং আমাদের জানান!
টম পুনরায়

উত্তর:


277

আপনার পরিস্থিতির উপর নির্ভর করে কয়েকটি পৃথক পদ্ধতি রয়েছে। শর্তসাপেক্ষে একটি ক্ষেত্রের প্রয়োজনের জন্য আমি চারটি ভিন্ন উপায় সম্পর্কে ভাবতে পারি।

নির্ভরতা

dependenciesশব্দ একটি শর্তাধীন তারতম্য আছে requiredশব্দ। পূর্বাভাস সম্পত্তি dependencies, যদি সম্পত্তিটি বৈধতাপ্রাপ্ত জেএসওএন-তে উপস্থিত থাকে তবে সেই কীটির সাথে সম্পর্কিত স্কিমাটিও বৈধ হতে হবে। যদি "foo" সম্পত্তি উপস্থিত থাকে তবে "বার" সম্পত্তিটি প্রয়োজন

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "dependencies": {
    "foo": { "required": ["bar"] }
  }
}

এখানে একটি সংক্ষিপ্ত ফর্মও রয়েছে যদি স্কিমাতে কেবল requiredকীওয়ার্ড থাকে।

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "dependencies": {
    "foo": ["bar"]
  }
}

জড়িত

যদি আপনার অবস্থা কোনও ক্ষেত্রের মানের উপর নির্ভর করে তবে আপনি বোঝা নামক একটি বুলিয়ান লজিক ধারণাটি ব্যবহার করতে পারেন। "এ বোঝায় বি" এর কার্যকর অর্থ, যদি এ সত্য হয় তবে বি অবশ্যই সত্য হতে হবে। প্রভাব "! এ বা বি" হিসাবেও প্রকাশ করা যেতে পারে। হয় "foo" সম্পত্তি "বার" এর সমান হয় না, বা "বার" সম্পত্তি প্রয়োজন । অথবা, অন্য কথায়: "foo" সম্পত্তি যদি "বার" এর সমান হয়, তবে "বার" সম্পত্তিটি প্রয়োজন

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "anyOf": [
    {
      "not": {
        "properties": {
          "foo": { "const": "bar" }
        },
        "required": ["foo"]
      }
    },
    { "required": ["bar"] }
  ]
}

যদি "foo" "বার" এর সমান না হয়, #/anyOf/0মিল এবং বৈধতা সফল হয়। যদি "foo" "বার" এর সমান #/anyOf/0হয় , ব্যর্থ হয় এবং বৈধতা সফল হওয়ার #/anyOf/1জন্য অবশ্যই বৈধ হতে হবে anyOf

এনাম

যদি আপনার শর্তসাপেক্ষ একটি এনামের উপর ভিত্তি করে থাকে তবে এটি আরও কিছুটা সোজা এগিয়ে। "ফু" "বার" বা "বাজ" হতে পারে। যদি "foo" "বার" এর সমান হয়, তবে "বার" প্রয়োজন। যদি "ফু" সমান "বাজ" হয়, তবে "বাজ" প্রয়োজন।

{
  "type": "object",
  "properties": {
    "foo": { "enum": ["bar", "baz"] },
    "bar": { "type": "string" },
    "baz": { "type": "string" }
  },
  "anyOf": [
    {
      "properties": {
        "foo": { "const": "bar" }
      },
      "required": ["bar"]
    },
    {
      "properties": {
        "foo": { "const": "baz" }
      },
      "required": ["baz"]
    }
  ]
}

যদি-তবে-অন্যথায়

একটি অপেক্ষাকৃত নতুন উপরন্তু তাদেরকে JSON স্কিমা (খসড়া-07) যোগ if, thenএবং elseকীওয়ার্ড। যদি "foo" সম্পত্তি "বার" এর সমান হয়, তবে "বার" বৈশিষ্ট্যটি প্রয়োজনীয়

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "if": {
    "properties": {
      "foo": { "const": "bar" }
    },
    "required": ["foo"]
  },
  "then": { "required": ["bar"] }
}

সম্পাদনা 12/23/2017: ইমপ্লিকেশন বিভাগ আপডেট হয়েছে এবং যদি-তবে-অন্য বিভাগ যুক্ত করা হয়েছে।

সম্পাদনা 06/04/2018: যদি-তবে-অন্যথায় বাগফিক্স enumএবং ব্যবহার করতে সিঙ্গলটন গুলি আপডেট করুন const


7
@ স্কব্বো আমি if-then-elseকীওয়ার্ডগুলির অনুরাগী নই এবং আমি সেগুলি ব্যবহার করতে রাজি নই। তবে, আপনি যদি এটি ব্যবহার করতে চান তবে আমি আপনাকে সর্বদা তাদের allOfকেবল এমন তিনটি কীওয়ার্ড ধারণ করে এমন মোড়ানো পরামর্শ দিই । { ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
জেসন ডেস্রোয়েসিয়র

4
@ জেসন কেন ভক্ত নন if...? আমি মনে করি আপনার উত্তরে এ সম্পর্কে একটি সংক্ষিপ্ত মতামত সম্পূর্ণ ন্যায়সঙ্গত হবে। নাকি এটি দীর্ঘ গল্প?
ক্লে সেতুগুলি

7
@ ক্লেব্রিজেস মন্তব্য বিভাগটি সেই আলোচনার জন্য সঠিক জায়গা নয়, তবে এখানে সংক্ষিপ্ত সংস্করণটি রয়েছে। একটি সাধারণ নিয়ম হিসাবে, জেএসওএন স্কিমা কীওয়ার্ডগুলি রাষ্ট্রহীন। মূলশব্দটির মান ব্যতীত অন্য কোনও তথ্য ব্যবহার করা যাবে না। if, thenএবং elseএই বিধি লঙ্ঘন কারণ তারা একে অপরের উপর নির্ভর করে।
জেসন ডেস্রোয়েজার্স

4
@ জিগার্ড, আমি জেএসএন স্কিমাতে এই নিদর্শনগুলির ব্যবহারের সর্বোত্তম চিকিত্সা। বুলিয়ান অপারেশনগুলি আনুষ্ঠানিকভাবে নথিভুক্ত করা হয়েছে তবে বাকিগুলি কেবল গণিতের। allOf== এবং, anyOf== ওআর, oneOf== এক্সওর এবং not== নয়। আপনি গণিতে স্টাফের (যেমন জড়িতকরণ) আরও উত্সের জন্য "বুলিয়ান বীজগণিত" গুগল করতে পারেন।
জেসন ডেস্রোয়েজার্স

4
@ অ্যালেক্সি শ্রব আমি কিছুক্ষণের জন্য এই সম্পর্কে লিখতে চাইছিলাম, তবে অন্যান্য বিষয়গুলির দ্বারা বিভ্রান্ত হয়ে পড়েছে। আমি শর্তসাপেক্ষে ধারণাটির একটি অনুরাগী । এটি মানুষের পক্ষে বুঝতে সহজ করে তোলে। আমার আপত্তিটি তিনটি পৃথক রাষ্ট্রীয় কীওয়ার্ড হিসাবে ব্যাখ্যা করা হয়েছে (পূর্ববর্তী মন্তব্য দেখুন)। অন্যান্য কীওয়ার্ড অনুসরণ করে এমন স্থাপত্য বৈশিষ্ট্যগুলিকে লঙ্ঘন করে এমন কীওয়ার্ডগুলি থাকা JSON স্কিমা বৈধদের কার্যকর করা আরও কঠিন এবং কম দক্ষ করে তোলে। শর্তসাপেক্ষে যদি রাষ্ট্রবিহীন এমন কোনও উপায়ে সংজ্ঞায়িত করা হয় তবে আমার কোনও আপত্তি হবে না।
জেসন ডেস্রোয়েজার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.