无法解析的Json响应

时间:2017-07-27 11:15:37

标签: php actions-on-google google-home

由于我没有使用模拟器获取accessToken请求我按上述方式执行了上述操作 https://developers.google.com/actions/identity/account-linking#json
请求登录助手

    header('Content-Type: application/json');
   $askToken = array (
  'conversationToken' => '{"state":null,"data":{}}',
  'expectUserResponse' => true,
  'expectedInputs' => 
  array (
    0 => 
    array (
      'inputPrompt' => 
      array (
        'initialPrompts' => 
        array (
          0 => 
          array (
            'textToSpeech' => 'MY AUTHENTICATION END POINT URL',
          ),
        ),
        'noInputPrompts' => 
        array (
        ),
      ),
      'possibleIntents' => 
      array (
        0 => 
        array (
          'intent' => 'actions.intent.SIGN_IN',
          'inputValueData' => 
          array (
          ),
        ),
      ),
    ),
  ),
);
echo json_encode($askToken);


    exit();

我收到错误

模拟器响应

"

sharedDebugInfo": [
            {
                "name": "ResponseValidation",
                "subDebugEntry": [
                    {
                        "name": "UnparseableJsonResponse",
                        "debugInfo": "API Version 2: Failed to parse JSON response string with 'INVALID_ARGUMENT' error: \"expected_inputs[0].possible_intents[0]: Proto field is not repeating, cannot start list.\"."
                    }
                ]
            }
        ]
    },
    "visualResponse": {}
}

错误

API版本2:无法使用' INVALID_ARGUMENT'解析JSON响应字符串错误:\" expected_inputs [0] .possible_intents [0]:原始字段不重复,无法启动列表。\"。"

1 个答案:

答案 0 :(得分:4)

对于初学者来说 - 这是来自模拟器的非常好的错误消息。它告诉您JSON中存在错误的确切路径,因此可以使用the webhook response的文档来跟踪JSON可能看起来不像预期的JSON的原因。

在这种情况下,inputValueData的值必须是JSON对象,而不是JSON数组。默认情况下,PHP的json_encode()函数假定空的PHP数组是空的JSON数组(这是noInputPrompts属性的正确假设。)

你需要强迫它成为一个对象。您无法使用JSON_FORCE_OBJECT设置,因为noInputPrompts会更改为对象,这也是错误的。

您需要使用

等语法将数组转换为对象
(object)array()

所以你的代码看起来像

$askToken = array (
  'conversationToken' => '{"state":null,"data":{}}',
  'expectUserResponse' => true,
  'expectedInputs' => 
  array (
    0 => 
    array (
      'inputPrompt' => 
      array (
        'initialPrompts' => 
        array (
          0 => 
          array (
            'textToSpeech' => 'MY AUTHENTICATION END POINT URL',
          ),
        ),
        'noInputPrompts' => 
        array (
        ),
      ),
      'possibleIntents' => 
      array (
        0 => 
        array (
          'intent' => 'actions.intent.SIGN_IN',
          'inputValueData' => 
          (object)array (
          ),
        ),
      ),
    ),
  ),
);
echo json_encode($askToken);