Javascript 如何将Firestore文档转换为纯json,反之亦然
我正在尝试使用RESTAPI获取firestore文档,它以以下格式返回数据Javascript 如何将Firestore文档转换为纯json,反之亦然,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我正在尝试使用RESTAPI获取firestore文档,它以以下格式返回数据 {"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}} 在进行更新调用之前,如何将上面的文档转换为下面这样的纯JavaScript对象,并将其转换回firestore文档 {"list1":["item1","item2"]} Firestore控制台中我的数据的屏幕截图 编辑
{"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}
在进行更新调用之前,如何将上面的文档转换为下面这样的纯JavaScript对象,并将其转换回firestore文档
{"list1":["item1","item2"]}
Firestore控制台中我的数据的屏幕截图
编辑:更多信息
json样本1由Firestore api返回,包含所有数据类型信息
json sample2是我的实际数据,没有类型信息
我的问题是firestore RestApi get调用以json sample1格式返回响应。我想更新api响应中的一些信息,并将更新后的值发送回firestore db。但是由于响应中的所有类型信息,我无法在必要时更新值。所以我试图找出是否有一种方法可以将api响应转换为json sample2
使用的API URL:{project_id}/databases/{database_id}/documents/{document_path}转换此输入:
{"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}
对于此输出:
{"list1":["item1","item2"]}
你可以做:
let input={“fields”:{“list1”:{“arrayValue”:{“values”:[{“stringValue”:“item1”},{“stringValue”:“item2”}}};
let expected={“list1”:[“item1”,“item2”]};
让输出={};
Object.key(input.fields).forEach((fieldName)=>{
让arrayValue=input.fields[fieldName].arrayValue;
if(arrayValue){
输出[fieldName]=arrayValue.values.map((值)=>value.stringValue);
}
});
控制台日志(输出)代码>转换此输入:
{"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}
对于此输出:
{"list1":["item1","item2"]}
你可以做:
let input={“fields”:{“list1”:{“arrayValue”:{“values”:[{“stringValue”:“item1”},{“stringValue”:“item2”}}};
let expected={“list1”:[“item1”,“item2”]};
让输出={};
Object.key(input.fields).forEach((fieldName)=>{
让arrayValue=input.fields[fieldName].arrayValue;
if(arrayValue){
输出[fieldName]=arrayValue.values.map((值)=>value.stringValue);
}
});
控制台日志(输出)代码>似乎只有编写自己的转换才能使用RESTAPI。下面的代码符合我的要求
让jsontocument=函数(值){
如果(!isNaN(值)){
if(value.toString().indexOf('.')!=-1)
返回{'doubleValue':value};
其他的
返回{'integerValue':value};
}else if(value=='true'| | value=='false'| | typeof value=='boolean'){
返回{'booleanValue':value};
}else if(Date.parse(value)){
返回{'timestampValue':value};
}else if(typeof value=='string'){
返回{'stringValue':value};
}else if(value&&value.constructor==数组){
返回{'arrayValue':{values:value.map(v=>jsonToDocument(v))};
}else if(typeof value==='object'){
设obj={};
for(让o表示值){
obj[o]=jsonToDocument(值[o]);
}
返回{'mapValue':{fields:obj}};
}
}
让documentToJson=函数(字段){
让结果={};
for(在字段中设f){
设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)
如果(项目)
返回值;
else if('mapValue'==键)
返回documentToJson(value.fields |{});
else if('arrayValue'==键){
让列表=value.values;
return!!list?list.map(l=>documentToJson(l)):[];
}
}否则{
结果[键]=documentToJson(值)
}
}
返回结果;
}
让documentData={“list1”:{“arrayValue”:{“values”:[{“stringValue”:“item1”},{“stringValue”:“item2”}]}}
让jsonData=documentToJson(documentData);
让documentData1=jsonToDocument(jsonData).mapValue.fields;
log(JSON.stringify(documentData));
log(JSON.stringify(jsonData));
log(JSON.stringify(documentData1))代码>似乎只有编写自己的转换才能使用RESTAPI。下面的代码符合我的要求
让jsontocument=函数(值){
如果(!isNaN(值)){
if(value.toString().indexOf('.')!=-1)
返回{'doubleValue':value};
其他的
返回{'integerValue':value};
}else if(value=='true'| | value=='false'| | typeof value=='boolean'){
返回{'booleanValue':value};
}else if(Date.parse(value)){
返回{'timestampValue':value};
}else if(typeof value=='string'){
返回{'stringValue':value};
}else if(value&&value.constructor==数组){
返回{'arrayValue':{values:value.map(v=>jsonToDocument(v))};
}else if(typeof value==='object'){
设obj={};
for(让o表示值){
obj[o]=jsonToDocument(值[o]);
}
返回{'mapValue':{fields:obj}};
}
}
让documentToJson=函数(字段){
让结果={};
for(在字段中设f){
设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)
如果(项目)
返回值;
else if('mapValue'==键)
返回documentToJson(value.fields |{});
else if('arrayValue'==键){
让列表=value.values;
return!!list?list.map(l=>documentToJson(l)):[];
}
}否则{
结果[ke]