繁体   English   中英

如何将 Firestore 文档转换为普通 json,反之亦然

[英]How to convert a Firestore Document to plain json and vice versa

我正在尝试使用 Rest API 获取 Firestore 文档,它以以下格式返回数据

{"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}

如何将上述文档转换为普通 JavaScript object 如下所示,然后在进行更新调用之前将其转换回firestore文档

{"list1":["item1","item2"]}

Firestore 控制台中我的数据的屏幕截图在此处输入图像描述

编辑:更多信息

json sample1 由 Firestore api 返回,并具有所有数据类型信息

json sample2 是我的实际数据,没有类型信息。

我的问题是 firestore RestApi get call 以 json sample1 格式返回响应。 我想更新 api 响应中的一些信息,并将更新的值发送回 firestore db。 但是由于响应中的所有类型信息,我无法在必要时更新值。 所以我试图找出是否有办法将 api 响应转换为 json sample2。

API URL 使用: https://firestore.googleapis.com/v1/projects/projects/projects/ {project_id}/documents_id_id}

似乎与 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));

我只想建议对@mahindar 处理“nullValue”的答案进行细微更改,因为 Firestore 最近允许保存 null 值。 以下是更新后的代码

 let jsonToDocument = function (value) { if (:value) { return { 'nullValue'; null }. } else 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', 'nullValue'],find(t => t === key), if (isDocumentType) { let item = ['stringValue', 'booleanValue', 'doubleValue'. 'integerValue'; 'timestampValue'. 'nullValue'];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" }] } }. "another_value"; { "nullValue". null } } 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));

要转换此输入:

{"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}

对于这个 output:

{"list1":["item1","item2"]}

你可以做:

 let input = {"fields":{"list1":{"arrayValue":{"values":[{"stringValue":"item1"},{"stringValue":"item2"}]}}}}; let expected = {"list1":["item1","item2"]}; let output = {}; Object.keys(input.fields).forEach((fieldName) => { let arrayValue = input.fields[fieldName].arrayValue; if (arrayValue) { output[fieldName] = arrayValue.values.map((value) => value.stringValue); } }); console.log(output);

如何将 Firestore 文档转换为普通 JSON object:

function toValue(field) {
  return "integerValue" in field
    ? Number(field.integerValue)
    : "doubleValue" in field
    ? Number(field.doubleValue)
    : "arrayValue" in field
    ? field.arrayValue.values.map(toValue)
    : "mapValue" in field
    ? toJSON(field.mapValue)
    : Object.entries(field)[0][1];
}

function toJSON(doc) {
  return Object.fromEntries(
    Object.entries(doc.fields ?? {}).map(([key, field]) => [key, toValue(field)])
  );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM