Json 如何将Google翻译结果与输入字符串匹配

Json 如何将Google翻译结果与输入字符串匹配,json,coldfusion,google-translate,google-translation-api,Json,Coldfusion,Google Translate,Google Translation Api,我想把N个美国英语转换成其他语言。我有一个US字符串作为“JSON”格式,如下所示 "AdminLocales": { "-locale": "en_US", "global": { "search": "Search", "noOrdersFound": "No Orders Found", "prevPage": "Prev Page", "nextPage": "Next Page" }, "language

我想把N个美国英语转换成其他语言。我有一个US字符串作为“JSON”格式,如下所示

"AdminLocales": {
    "-locale": "en_US",
    "global": {
      "search": "Search",
      "noOrdersFound": "No Orders Found",
      "prevPage": "Prev Page",
      "nextPage": "Next Page"
    },
     "languageList": {
      "1": {
        "type": "Student",
        "area": "Kovilpatti"
      },
      "2": {
        "type": "Employee",
        "area": "Tuticorin"
      },
    }
}
我要转换近3000个字符串。所以我已经反序列化了我的输入,并在数据上循环。这意味着我为每个字符串调用了google翻译API,因此我的API调用将是3000次

因此,在API中调用那么多时间时,我面临请求超时问题。像下面的代码

<cfset myKey = 'abcd'>
<cfhttp url="https://translation.googleapis.com/language/translate/v2?key=#myKey#" method="post" charset="utf-8"  result="getTokens">
      <cfhttpparam type="header" name="Content-Type" value="application/json">
      <cfhttpparam type="body" name="data" value="{
 'q': 'Welcome',
 'target': 'hi'
}"> 
</cfhttp>
这是正常测试的好方法

现在回到我的输入,我如何能够同时传递所有输入并与https调用的结果匹配。因为我没有输入的顺序。我有结构的结构和它的子结构等。。。从我的输入,如果我传递为“搜索,上一页,下一页,Studen,Kovilpatti等”(源字符串),它返回相同的顺序。在这里,我如何匹配特定的源字符串的特定结果


谷歌是否希望你输入一个键来识别正确的返回

最后我找到了一个逻辑解决方案。这里我已经解释了如何解决这种情况。我们可以通过传递一些分隔符来实现这一点。这里我使用-(连字符)作为分隔符

<cfset myStr = {'Name':'Kannan','State':'Tamilnadu','Country':'India','Position':'Projects Lead','Description':'Test translate API call'}>

这是我原来的结构。我已经用连字符delimeter转换了这个结构的键值,如下所示

<cfset convertString = ''>
<cfloop index='keys' list="#keyList#">
    <cfset convertString = listAppend(convertString,structFind(myStr,keys),'-')>
</cfloop>

现在,我的字符串看起来像泰米尔纳德坎南测试翻译API调用印度项目领导

我可以通过调用下面的API在单个http调用中传递上述字符串

<cfhttp url="https://translation.googleapis.com/language/translate/v2?key=myApiKey132" method="post" charset="utf-8"  result="returnData">
     <cfhttpparam type="header" name="Content-Type" value="application/json">
     <cfhttpparam type="body" name="data" value="{
'q': '#convertString#',
'target': 'hi'
}"> 
 </cfhttp>

API调用返回如下图所示的数据,

因此,我转换的字符串应该通过delimeter,如तमिलनाडु-कन्नन-टेस्ट अनुवाद एपीआई कॉल-इंडिया-प्रोजेक्ट्स लीड

现在,我可以根据我的delimeter-(连字符)循环结果,并匹配我的结构键,如下面的代码所示

<cfset convertStr = {}>
<cfset apiResult = deserializeJSON(returnData.filecontent)>

<cfset a = 1>
<cfloop index="result" list="#apiResult.data.translations[1].translatedText#" delimiters="-">
    <cfset structInsert(convertStr,listgetat(keyList,a),result)>
    <cfset a = a+1>
</cfloop>

最后我得到了预期的结果

原始结构

翻译后:

<cfdump var="#convertStr#" label="Google Translate Structure" />


感谢大家对这些问题的关注

您可以控制源字符串吗?可以。我有控制权@AgeaxIf如果您正在构建JSON字符串,您可以使用“有序”结构(在CF2016中新增)来维护添加项的顺序。否则,您可能必须使用数组手动跟踪订单。然后将其与google返回的数组匹配。编辑AFAIK,当您使用结构文字语法时,不支持有序结构,在任何版本中都不支持。考虑到JSON的流行,这是非常令人惊讶的。。。。
<cfset convertStr = {}>
<cfset apiResult = deserializeJSON(returnData.filecontent)>

<cfset a = 1>
<cfloop index="result" list="#apiResult.data.translations[1].translatedText#" delimiters="-">
    <cfset structInsert(convertStr,listgetat(keyList,a),result)>
    <cfset a = a+1>
</cfloop>
<cfdump var="#convertStr#" label="Google Translate Structure" />