JSON SCHEMA - 如何检查数组中是否存在值

时间:2017-06-10 19:15:33

标签: jsonschema

我有一个简单的问题。我有一个属性 groupBy 这是一个数组,只包含两个可能的值“product”和“date”。现在我想根据 groupBy 数组中的值存在创建另一个属性。在这种情况下,当我的 groupBy 数组包含“date”时,我想要进行解析!我怎么能这样做?

我可以检查数组是否包含值?

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="tasks" class="col-md-12 table">
    <thead>
        <tr>
          <td>Service</td>
          <td>Key notes</td>
          <td>Claim Amount</td>
          <td>Vetted Amount</td>
        </tr>
    </thead>
    <tbody>
        <tr class="therow">
          <td class="claim_value">hey</td>
          <td class="vet_value"></td>
          <td>
          <button class="button">button</button>
          </td>
        </tr>
        <tr class="therow">
          <td class="claim_value">you</td>
          <td class="vet_value"></td>
          <td>
          <button class="button">button</button>
          </td>
        </tr>
        <tr class="therow">
          <td class="claim_value">me</td>
          <td class="vet_value"></td>
          <td>
          <button class="button">button</button>
          </td>
        </tr>
        <tr class="therow">
          <td class="claim_value">them</td>
          <td class="vet_value"></td>
          <td>
          <button class="button">button</button>
          </td>
        </tr>
    </tbody>    
</table>

2 个答案:

答案 0 :(得分:4)

要解决这个问题,我们必须使用一个名为implication的布尔逻辑概念。为了将要求放在布尔逻辑术语中,我们会说“groupBy”包含“date”暗示需要“解析”。含义可表示为“(不是A)或B”。换句话说,“groupBy”不包含“date”,或者“resolution”是必需的。在这种形式下,应该更清楚如何实施解决方案。

{
  "type": "object",
  "properties": {
    "pcsStreamId": { "type": "number" },
    "start": { "type": "integer", "minimum": 0 },
    "end": { "type": "integer", "minimum": 0 },
    "groupBy": {
      "type": "array",
      "uniqueItems": true,
      "items": { "enum": ["product", "date"] }
    },
    "resolution": { "enum": ["day", "year", "month", "shift"] }
  },
  "required": ["pcsStreamId", "start", "end", "groupBy"],
  "anyOf": [
    { "not": { "$ref": "#/definitions/contains-date" } },
    { "required": ["resolution"] }
  ],
  "definitions": {
    "contains-date": {
      "properties": {
        "groupBy": {
          "contains": { "enum": ["date"] }
        }
      }
    }
  }
}

修改

此答案使用新的草案06 contains关键字。我使用它是因为提问者使用它,但如果您使用的是draft-04,则可以使用“contains-date”的这个定义。它使用另一个逻辑标识(∃xA&lt; =&gt;¬∀x¬A)来获取contains关键字的功能。

{
  "definitions": {
    "contains-date": {
      "properties": {
        "groupBy": {
          "not": {
            "items": {
              "not": { "enum": ["date"] }
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

您的groupby属性似乎是一个对象。可能是它所讨论的嵌套枚举属性(因为它是一个数组并包含日期和产品)。但是,一旦将此json解析为对象,您可以检查以下内容:

groupby.items.enums.indexOf('date') === -1

array.indexOf(anyItem)返回项的索引,如果在数组中存在,则返回-1。

希望有所帮助