从 Java SpringBoot 中的 Google Dialogflow 获取原始响应 JSON

Get raw response JSON from Google Dialogflow in Java SpringBoot

我需要从我的 Java SpringBoot 应用程序 return 来自 Google Dialogflow API 的响应。 detectIntent() API 的响应类型是 DetectIntentResponse。然而,这个 class 会产生一个复杂的 JSON。 Dialogflow创建的实际JSON在诊断工具中要简单得多。

有没有办法从 Dialogflow API 获取实际的原始响应而不是解析 DetectIntentResponse class 因为它保留了我的字段的长嵌套不想?

使用了 Google 中的示例代码 - https://github.com/googleapis/DetectIntentTexts.java

Dialogflow 诊断工具原始响应 - 参考 - dialogflow-reference-DetectIntentResponse

{
  "responseId": "856510ca-f617-4e25-b0bb-a26c0a59e030-19db3199",
  "queryResult": {
    "queryText": "I know french",
    "parameters": {
      "language": "French",
      "language-programming": ""
    },
    "allRequiredParamsPresent": true,
    "fulfillmentText": "Wow! I didn't know you knew French. How long have you known French?",
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            "Wow! I didn't know you knew French. How long have you known French?"
          ]
        }
      }
    ],
    "outputContexts": [
      {
        "name": "projects/project-id/agent/sessions/123456789/contexts/set-language-followup",
        "lifespanCount": 2,
        "parameters": {
          "language": "French",
          "language.original": "french",
          "language-programming": "",
          "language-programming.original": ""
        }
      }
    ],
    "intent": {
      "name": "projects/project-id/agent/intents/fe45022f-e58a-484f-96e8-1cbd6628f648",
      "displayName": "set-language"
    },
    "intentDetectionConfidence": 1,
    "languageCode": "en"
  }
}

我希望响应完全像这样,而不是 DetectIntentResponse Java class 附带的所有额外字段 - 基本上删除所有未设置的字段和对象嵌套。

DetectIntentResponse class 直接解析为 JSON -

的响应
query_result {
  query_text: "testing testing 123 abc@gmail.com"
  action: "test"
  parameters {
    fields {
      key: "email"
      value {
        string_value: "abc@gmail.com"
      }
    }
    fields {
      key: "number-integer"
      value {
        list_value {
          values {
            number_value: 123.0
          }
        }
      }
    }
  }
  all_required_params_present: true
  fulfillment_text: "testing invoked"
  fulfillment_messages {
    text {
      text: "testing invoked"
    }
  }
  output_contexts {
    name: "projects/*****/agent/sessions/session-test/contexts/testing-context"
    lifespan_count: 5
    parameters {
      fields {
        key: "email"
        value {
          string_value: "abc@gmail.com"
        }
      }
      fields {
        key: "email.original"
        value {
          string_value: "abc@gmail.com"
        }
      }
      fields {
        key: "number-integer"
        value {
          list_value {
            values {
              number_value: 123.0
            }
          }
        }
      }
      fields {
        key: "number-integer.original"
        value {
          string_value: "123"
        }
      }
    }
  }
  intent {
    name: "projects/*****/agent/intents/*****"
    display_name: "test"
  }
  intent_detection_confidence: 1.0
  language_code: "en"
}

我需要删除 fieldskeyvaluestring_valuelist_value 和所有此类附加字段以获取原始文件原始响应。

在查阅了一些文档之后,我找到了完美的解决方案。

有一个 Google 库可以作为依赖项添加到应用程序中,它将 DetectIntentResponse 对象的响应解析为原始原始响应 JSON。

build.gradle

implementation 'com.google.protobuf:protobuf-java-util:4.0.0-rc-2'

detectIntent()

import com.google.protobuf.util.JsonFormat;

DetectIntentResponse response = sessionClient.detectIntent(session, queryInput);
return JsonFormat.printer().print(response);