我正在尝试使用Rest API来获取firestore文档,并且它以以下格式返回数据
{"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}
我如何将上述文档转换为如下所示的普通JavaScript对象,并将其转换回Firestore文档,然后再进行更新调用
{"list1":["item1","item2"]}
编辑:更多信息
JSON sample1由Firestore API返回,并具有所有数据类型信息
json sample2是我的实际数据,没有类型信息。
我的问题是Firestore RestApi get调用以json sample1格式返回响应。我想更新api响应中的一些信息,并将更新后的值发送回Firestore数据库。但是由于响应中的所有类型信息,我无法在必要时更新值。所以我试图找到是否有一种方法可以将api响应转换为json sample2。
使用的API URL:https : //firestore.googleapis.com/v1/projects/projects/ {project_id} / databases / {database_id} / documents / {document_path}
似乎使用rest api的唯一方法是编写自己的转换。下面的代码满足了我的要求
let jsonToDocument = function (value) {
if (!isNaN(value)) {
if (value.toString().indexOf('.') != -1)
return { 'doubleValue': value };
else
return { 'integerValue': value };
} else if (value === 'true' || value === 'false' || typeof value == 'boolean') {
return { 'booleanValue': value };
} else if (Date.parse(value)) {
return { 'timestampValue': value };
} else if (typeof value == 'string') {
return { 'stringValue': value };
} else if (value && value.constructor === Array) {
return { 'arrayValue': { values: value.map(v => jsonToDocument(v)) } };
} else if (typeof value === 'object') {
let obj = {};
for (let o in value) {
obj[o] = jsonToDocument(value[o]);
}
return { 'mapValue': { fields: obj } };
}
}
let documentToJson = function (fields) {
let result = {};
for (let f in fields) {
let key = f, value = fields[f],
isDocumentType = ['stringValue', 'booleanValue', 'doubleValue',
'integerValue', 'timestampValue', 'mapValue', 'arrayValue'].find(t => t === key);
if (isDocumentType) {
let item = ['stringValue', 'booleanValue', 'doubleValue', 'integerValue', 'timestampValue']
.find(t => t === key)
if (item)
return value;
else if ('mapValue' == key)
return documentToJson(value.fields || {});
else if ('arrayValue' == key) {
let list = value.values;
return !!list ? list.map(l => documentToJson(l)) : [];
}
} else {
result[key] = documentToJson(value)
}
}
return result;
}
let documentData = { "list1": { "arrayValue": { "values": [{ "stringValue": "item1" }, { "stringValue": "item2" }] } } }
let jsonData = documentToJson(documentData);
let documentData1 = jsonToDocument(jsonData).mapValue.fields;
console.log(JSON.stringify(documentData));
console.log(JSON.stringify(jsonData));
console.log(JSON.stringify(documentData1));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句