如何让JSON Schema在Visual Studio 2015中工作(智能感知和验证)

时间:2016-08-25 08:24:45

标签: json visual-studio visual-studio-2015 jsonschema

我在获取json文件时遇到问题我试图创建使用我已经制作的json模式,以便我可以利用智能感知和验证来确保json I必须手抓果力好。我不确定我的架构是否错误,或者我是如何尝试让VS2015使用它的。

现在,我已将所有架构内容抛入一个文件中(尝试将其拆分时出现问题)。



{
  "$schema": "http://json-schema.org/schema#",
  "id": "http://savatronix.com/jsonschemas/losthaven1/MainSchemaV1.json",
  "title": "Lost Haven Common JSON",
  "description": "A schema for json types that will be common across many different object types. V1",
  "definitions": {
    "gameDateTime": {
      "type": "object",
      "properties": {
        "year": {
          "type": "integer",
          "minimum": 0
        },
        "month": {
          "type": "string",
          "enum": [ "Nil", "Spring", "Summer", "Autumn", "Winter" ]
        },
        "weekday": {
          "type": "string",
          "enum": [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]
        },
        "day": {
          "type": "integer",
          "minimum": 0,
          "maximum": 30
        },
        "hour": {
          "type": "integer",
          "minimum": 0,
          "maximum": 23
        },
        "minute": {
          "type": "integer",
          "minimum": 0,
          "maximum": 59
        },
        "second": {
          "type": "integer",
          "minimum": 0,
          "maximum": 59
        }
      }
    },
    "characterAttributes": {
      "type": "object",
      "properties": {
        "strength": {
          "type": "integer",
          "minimum": 0
        },
        "agility": {
          "type": "integer",
          "minimum": 0
        },
        "dexterity": {
          "type": "integer",
          "minimum": 0
        },
        "intelligence": {
          "type": "integer",
          "minimum": 0
        },
        "endurance": {
          "type": "integer",
          "minimum": 0
        },
        "charisma": {
          "type": "integer",
          "minimum": 0
        },
        "luck": {
          "type": "integer",
          "minimum": 0
        }
      }
    },
    "characterElements": {
      "type": "object",
      "properties": {
        "earth": { "type": "integer" },
        "wind": { "type": "integer" },
        "fire": { "type": "integer" },
        "water": { "type": "integer" },
        "lightning": { "type": "integer" },
        "light": { "type": "integer" },
        "dark": { "type": "integer" }
      }
    },
    "characterStatus": {
      "type": "object",
      "properties": {
        "poison": { "type": "integer" },
        "paralyze": { "type": "integer" },
        "sleep": { "type": "integer" },
        "fatigue": { "type": "integer" },
        "charm": { "type": "integer" },
        "confusion": { "type": "integer" }
      }
    },
    "characterStats": {
      "type": "object",
      "properties": {
        "attackPower": {
          "type": "integer",
          "minimum": 0
        },
        "block": {
          "type": "integer",
          "minimum": 0
        },
        "health": {
          "type": "integer",
          "minimum": 0
        },
        "defense": {
          "type": "integer",
          "minimum": 0
        },
        "evade": {
          "type": "integer",
          "minimum": 0
        },
        "attackSpeed": {
          "type": "integer",
          "minimum": 0
        },
        "parry": {
          "type": "integer",
          "minimum": 0
        },
        "stamina": {
          "type": "integer",
          "minimum": 0
        },
        "movementSpeedModifier": { "type": "integer" },
        "elementalPower": { "$ref": "#/definitions/characterElements" },
        "statusPower": { "$ref": "#/definitions/characterStatus" }
      }
    },
    "attributesAndStatsContainer": {
      "type": "object",
      "properties": {
        "attributes": { "$ref": "#/definitions/characterAttributes" },
        "stats": { "$ref": "#/definitions/characterStats" }
      }
    },
    "characterEquipmentState": {
      "type": "object",
      "properties": {
        "weaponId": { "type": "string" },
        "headgearId": { "type": "string" },
        "chestId": { "type": "string" },
        "legsId": { "type": "string" },
        "bootsId": { "type": "string" },
        "glovesId": { "type": "string" },
        "firstAccessoryId": { "type": "string" },
        "secondAccessoryId": { "type": "string" }
      }
    },
    "baseObjectState": {
      "type": "object",
      "properties": {
        "baseId": { "type": "string" },
        "referenceId": { "type": "string" }
      }
    },
    "characterState": {
      "type": "object",
      "allOf": [
        { "$ref": "#/definitions/baseObjectState" },
        {
          "properties": {
            "characterName": { "type": "string" },
            "characterSex": {
              "type": "string",
              "enum": [ "Unknown", "Male", "Female" ]
            },
            "race": {
              "type": "string",
              "enum": [ "Unknown", "Human", "Yokai" ]
            },
            "baseStats": { "$ref": "#/definitions/attributesAndStatsContainer" },
            "currentHealth": {
              "type": "integer",
              "minimum": 0
            },
            "birthday": { "$ref": "#/definitions/gameDateTime" },
            "equippedItems": { "$ref": "#/definitions/characterEquipmentState" }
          }
        }
      ]
    },
    "enemyStateObject": {
      "type": "object",
      "allOf": [
        { "$ref": "#/definitions/characterState" },
        {
          "properties": {
            "isBoss": { "type": "boolean" }
          }
        }
      ]
    },
    "enemyState": {
      "type": "object",
      "properties": {
        "enemies": {
          "type": "array",
          "items": { "$ref": "#/definitions/enemyStateObject" },
          "minItems": 1
        }
      }
    },
    "NpcState": {
      "type": "object",
      "allOf": [
        { "$ref": "#/definitions/characterState" },
        {
          "properties": {
            "backgroundInfo": { "type": "string" },
            "history": { "type": "string" },
            "personalityDescription": { "type": "string" },
            "job": {
              "type": "string",
              "enum": [ "None" ]
            },
            "isRecruitable": { "type": "boolean" },
            "isEligableSignificantOther": { "type": "boolean" },
            "significantOtherId": { "type": "string" },
            "wallet": {
              "type": "integer",
              "minimum": 0
            },
            "inventory": {
              "type": "array",
              "items": { "type": "string" }
            }
          }
        }
      ]
    }
  }
}




我试图使用enemyState定义创建一个包含敌人数组的对象(这样做是因为MSDN博客建议使用$ schema,因此VS会自动检测所需的模式)。



"enemyState": {
      "type": "object",
      "properties": {
        "enemies": {
          "type": "array",
          "items": { "$ref": "#/definitions/enemyStateObject" },
          "minItems": 1
        }
      }
    },




在我的Enemies.json中,我尝试过:



{
  "$schema": "../../../JsonSchemas/MainSchema.json#/definitions/enemyState"
}




那是" msdn博客文章"推荐的方法:Intellisense for JSON Schema in the JSON Editor

我也尝试省略,并将链接直接复制到编辑器中的架构位置栏。

键入$ Schema部分时,它是正确的位置,因为#/ defintions / enemyState部分可以正常工作。

然而,这是它的程度。在尝试创建实际的json时,我没有得到intellisense或验证。我试过关闭并重新打开文件,以及重新启动visual studio。

我希望得到的预期效果是获得智能感知和验证,这样我就可以创建一系列敌方状态对象(这是我正在制作的游戏中各种敌人的定义,并且会被阅读然后加载到Unity中并确保所需的属性(尚未在架构中创建,图I' d至少在其工作之后添加所需的属性),以及确保一切都在范围内,它验证了所以我知道没有错误。

任何帮助都将不胜感激。

非常感谢!

1 个答案:

答案 0 :(得分:2)

好的,所以我终于明白了它的工作原理。

我使用解决方案资源管理器创建了一个测试json文件 - > json架构并将其拖到JSON文件中,然后就可以了。

然后我将其修改为与我的架构的相关部分完全相同(调整$ ref' s,以便他们在需要时指向主模式文件)。

那很有效。

因此,无论出于何种原因,手动创建一个json文件(new - > text file - > rename)似乎会抛出Visual Studio并让它认为它直接设置为json时不是json文件json文件中的模式(但是VS能够很好地读取它,正如它如何从我的主模式文件中提取信息,通过我的" test" json模式文件,以及进入使用模式的实际json文件。

去图......