为了存储到 GCD 中,我想使用 Google Cloud Datastore JSON API,但我无法为具有另一个类成员的对象编写正确的Json
请求正文。考虑我有2
类:
public class Foo {
private String id;
private Bar bar;
// getter and setter...
}
public class Bar {
private String name;
private String pass;
// getter and setter...
}
然后,我创建一个包含Bar
类对象的类Foo
对象。所以我想将此对象插入云数据存储。我写了这个请求正文:
{
"transaction":"some bytes",
"mutation":{
"insert":[
{
"key":{
"partitionId":{
"datasetId":"s~my-dataset-id"
},
"path":[
{
"kind":"Foo",
"name":"id"
}
]
},
"properties":{
"bar":{
"entityValue":{
"name":{
"stringValue":"Jack"
},
"pass":{
"stringValue":"1234"
}
},
"indexed":false
},
"id":{
"stringValue":"id"
}
}
}
]
}
}
然后,除bar
之外的所有字段都将保存到云数据存储。我使用了"entityValue",但似乎我应该包括整个实体结构(感谢Adam的提及)。但我不需要它作为另一个实体,显然我不应该使用"entityValue"。那么我应该如何更改请求正文以插入这样的对象呢?
顺便说一下,我可以通过以下请求插入一个Bar
对象(但不是Foo
):
{
"transaction":"some bytes",
"mutation":{
"insert":[
{
"key":{
"partitionId":{
"datasetId":"s~my-project-id"
},
"path":[
{
"kind":"Bar",
"name":"John"
}
]
},
"properties":{
"pass":{
"stringValue":"1234"
},
"name":{
"stringValue":"John"
}
}
}
]
}
}
这是相关链接:相关链接
您可以将Bar
作为entityValue
包含在内。此值看起来像普通实体,但它不需要具有键。此实体值不需要单独存在于数据存储中。
例如:
{
"mutation":{
"insert":[
{
"key":{
"path":[
{
"kind":"Foo",
"name":"id"
}
]
},
"properties":{
"bar":{
"entityValue":{
"properties": {
"name":{
"stringValue":"Jack"
},
"pass":{
"stringValue":"1234"
}
}
},
"indexed":false
},
"id":{
"stringValue":"id"
}
}
}
]
},
"mode": "NON_TRANSACTIONAL"
}
另外作为旁注,请注意,此处Foo
的键省略了partitionId
。这是首选操作,数据存储将为您填写正确的partitionId
。
您必须包含"entityValue"的整个实体结构(包括"键"和"属性"字段)。这是因为您引用的是数据存储中的单独实体,而不仅仅是嵌入在当前实体中的另一个数据结构。看:
数据集:实体格式
https://cloud.google.com/datastore/docs/apis/v1beta2/entity
字段"entityValue":(Entity)"是一个线索,您需要从新实体的同一实体表示的开头开始。