在同一文档中引用$ id时,如何解决“无法解析引用”错误?

时间:2019-04-16 10:50:24

标签: javascript jsonschema ajv

我想用JavaScript中的Ajv针对JSON模式验证JSON。我收到错误消息:

抛出新的it.MissingRefError(it.baseId,$ schema,$ message);         ^ 错误:无法从id requestGetGraphs解析引用#/ definitions / requestGraph

在删除对其他架构的引用时:         {“ $ ref”:“#/ definitions / requestGraph”} 错误消失了。

JavaScript代码:

ajv.addSchema(require('./json-schema/graph-response'), 'graph-response.json');
ajv.validate('requestGetGraphs', `{"type" : "requestGetGraphs", "space" : "config", "v" : 1.1, "id" : "dsaf" }`);

graph-request.json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id" : "graph-requests.json",
  "definitions": {
    "requestGraph" : {
      "$id" : "#/definitions/requestGraph",
      "allOf" : [
        { "$ref" : "call.json/#/definitions/request" },
        {
          "properties": {
            "space": {
              "$id" : "#requestGraph/properties/space",
              "type": "string",
              "const": "config"
            }
          }
        }
      ]
    }
  },
  "requestGetGraphs" : {
      "$id" : "requestGetGraphs",
      "type" : "object",
      "allOf" : [
        {
          "properties": {
            "action": {
              "$id" : "#requestGetGraphs/properties/action",
              "type": "string",
              "const": "requestGetGraphs"
            }
          }
        },
        { "$ref" : "#/definitions/requestGraph" }
      ]

    }

}

1 个答案:

答案 0 :(得分:1)

这与URI解析有关。 选中https://tools.ietf.org/html/draft-handrews-json-schema-01#section-8.2.2

  

当“ $ id”设置基本URI时,包含该“ $ id”的对象和   可以使用JSON指针识别其所有子方案
  从该位置开始的片段。即使是
也是如此   进一步更改基本URI的子方案。因此,一个
  子模式可以通过多个URI访问,每个URI都由   在子模式或父级中声明的URI,以及JSON指针
  片段,用于标识来自声明的架构对象的路径
  被识别的子模式的基础。例如
  如第8.2.4节所述。

因为您指定的tf.reset_default_graph() num_inputs=501 num_hid1=250 num_hid2=100 num_hid3=50 num_hid4=num_hid2 num_hid5=num_hid1 num_output=num_inputs lr=0.01 actf=tf.nn.tanh output = np.random.rand(100,num_inputs) X=tf.placeholder(tf.float32,shape=[None,num_inputs]) initializer=tf.variance_scaling_initializer() w1=tf.Variable(initializer([num_inputs,num_hid1]),dtype=tf.float32) w2=tf.Variable(initializer([num_hid1,num_hid2]),dtype=tf.float32) w3=tf.Variable(initializer([num_hid2,num_hid3]),dtype=tf.float32) w4=tf.Variable(initializer([num_hid3,num_hid4]),dtype=tf.float32) w5=tf.Variable(initializer([num_hid4,num_hid5]),dtype=tf.float32) w6=tf.Variable(initializer([num_hid5,num_output]),dtype=tf.float32) b1=tf.Variable(tf.zeros(num_hid1)) b2=tf.Variable(tf.zeros(num_hid2)) b3=tf.Variable(tf.zeros(num_hid3)) b4=tf.Variable(tf.zeros(num_hid4)) b5=tf.Variable(tf.zeros(num_hid5)) b6=tf.Variable(tf.zeros(num_output)) hid_layer1=actf(tf.matmul(X,w1)+b1) hid_layer2=actf(tf.matmul(hid_layer1,w2)+b2) hid_layer3=actf(tf.matmul(hid_layer2,w3)+b3) hid_layer4=actf(tf.matmul(hid_layer3,w4)+b4) hid_layer5=actf(tf.matmul(hid_layer4,w5)+b5) output_layer=tf.matmul(hid_layer5,w6)+b6 saver = tf.train.Saver() with tf.Session() as sess: saver.restore(sess, 'my_test_model') print("Model restored.") x = sess.run(hid_layer3, feed_dict={X:output}) assert x.shape[1] == hid_layer3.shape[1] 前面没有哈希,所以它的解析就像是一个新的架构(因为它不是片段)。在$ id前面加一个散列前缀表示它是一个片段标识符,并相应地进行URI解析。

您可能还打算将requestGetGraphs嵌套在requestGetGraphs里面,对吗?