Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将Firestore文档转换为纯json,反之亦然_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 如何将Firestore文档转换为纯json,反之亦然

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控制台中我的数据的屏幕截图 编辑

我正在尝试使用RESTAPI获取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]