google-app-engine - golang Google端点接收用于Google实验室验证和存储的JSON,并将它的存储到Google数据存储中

  显示原文与译文双语对照的内容
0 0

我是新的,并且一直尝试获得我的Google端点运行,以接收一个JSON用于验证,然后存储在Google数据存储。

Golang端点包 https://github.com/GoogleCloudPlatform/go-endpoints

下面是我试图发布到go端点的JSON示例:

{"json": {"orderId":"123456789.12341234","packageName":"com.company.name","productId":"productName","purchaseTime": 1410655975266,"purchaseState": 0,"purchaseToken":"tokenData"},"signature":"signatureData"}

以下是我的Golang端点的代码示例:

type RawReceipt struct {
 Key *datastore.Key `json:"id" datastore:"-"`
 Receipt json.RawMessage `json:"json"`
}
func ReceiveJson(c endpoints.Context, rec *RawReceipt) error {
 k := datastore.NewIncompleteKey(c,"DatastoreTest", nil)
 _, err := datastore.Put(c, k, rec)
 return err
}

我正在尝试完成的伪代码:

var data below will need to contain {"orderId":"123456789.12341234","packageName":"com.company.name","productId":"productName","purchaseTime": 1410655975266,"purchaseState": 0,"purchaseToken":"tokenData"},"signature":"signatureData"}
func Json(rawJson *RawJson) {
 data := rawJson["json"]
 signature := rawJson["signature"]
 if Verify(jsonData, jsonSignature) {
//Store into Datastore
//The storing part works, just need to get the right data into it
 k := datastore.NewIncompleteKey(c,"DatastoreTest", nil)
 _, err := datastore.Put(c, k, rec)
 return err
 }
}
func Verify (jsonData *JData, jsonSignature, *Jsig) bool {
//I got this part working just fine.
 if fail or err return false, else true
}

我需要能够从 keys json json和签名获取值,这样我可以通过

{"json": {"orderId":"123456789.12341234","packageName":"com.company.name","productId":"productName","purchaseTime": 1410655975266,"purchaseState": 0,"purchaseToken":"tokenData"}

验证方法和签名

"signature":"signatureData"

作为验证方法的另一个参数。

如果我查看 of 。of,那么JSON超出了 比如的订单,而不是它的原始位置。

我最后要做的就是把整个JSON和存储存储在Google数据存储中。

另外,我一直在读这个文件,看看它的他的,问题,一直在试图获得这项工作。

任何你的帮助都有很大的价值,非常感谢 !

时间:原作者:4个回答

0 0

我没有 Google App Engine的经验,但是似乎你的核心问题是反序列化 JSON,这样你就可以只获取"签名"字段。

你可以将数据放入中,并引用该映射的signature 字段,如:

package main
import (
"encoding/json"
"fmt"
)
const data = `{
"json": {
"orderId":"123456789.12341234",
"packageName":"com.company.name",
"productId":"productName",
"purchaseState": 0,
"purchaseTime": 1410655975266,
"purchaseToken":"tokenData"
 },
"signature":"signatureData"
}`
func main() {
 receipt := make(map[string]interface{})
 json.Unmarshal([]byte(data), &receipt)
 signature, ok := receipt["signature"].(string)
 if!ok {
 fmt.Println("type assertion failed")
 return
 }
 fmt.Println(signature)
}

游乐场链接

在同一个示例中,你可以做 fmt.Printf("%#vn", receipt),它将显示 receipt["json"] 是另一个 map[string]interface{} 。 使用这里选项,可以将 json 中的字段作为:

foo, ok := receipt["json"].(map[string]interface{})
//... assertion checking, etc.
orderId, ok := foo["orderId"].(string)
//... assertion checking again

不确定在Google数据存储中存储 JSON 。 在这里给出他们的示例

顺便说一下,我不认为go对 key-value 对的排序有任何保证,所以你不应该假设它们将保留它们的顺序。

原作者:
0 0

Json作为数据类型不支持数据类型

所以你有几个选择来存储你的数据

  1. 就像 @Lander 所建议的,对数据进行分解并将它的存储为对象。

  2. 创建 RawMessage 并将它的存储为字节的[] 字节

  3. 创建一个包含json解解的每个字段的结构并存储它。

我找不到另一种方法来做?

原作者:
...