添加Firebase数据、点和正斜线

添加Firebase数据、点和正斜线,firebase,firebase-realtime-database,slash,Firebase,Firebase Realtime Database,Slash,我试着用db, 我发现了非常重要的限制,firebase帮助或常见问题解答中没有描述这些限制 第一个问题是符号:点“.”在键中被禁止 i、 e.firebase拒绝(原因不明)下一步: 键“/”中正斜杠的第二个问题, 当您尝试像这样添加密钥时 {'02/10/2013': true} 在firebase中,您可以看到: '02': { '10': { '2013': true

我试着用db, 我发现了非常重要的限制,firebase帮助或常见问题解答中没有描述这些限制

第一个问题是符号:点“.”在键中被禁止

i、 e.firebase拒绝(原因不明)下一步:

键“/”中正斜杠的第二个问题, 当您尝试像这样添加密钥时

        {'02/10/2013': true}
在firebase中,您可以看到:

         '02': {
             '10': {
                 '2013': true
             }
         }       
你有没有办法(自动)解决这个问题? 是否可以设置一些标志,表明它是包含所有符号的字符串键? 当然,我可以在每次写入之前和读取之后解析/恢复数据,但是


顺便说一下,'''./'-firebase?

的所有受限符号的字符限制都记录在-您不能在键名中使用''.'、'/'、'['、']'、'#'和'$'。没有自动转义这些字符的方法,我建议完全避免使用它们,或者创建您自己的转义/取消转义机制。

添加子级
02/10/2013
在Firebase中创建结构的原因是正斜杠导致创建新级别

因此,我假设您使用的行类似于:
firebaseRef.child('02/10/2013')。set(true)
相当于
firebaseRef.child('02')。child('10')。child('2013')。set(true)

为了避免无法在引用键名称()中使用以下字符的问题

  • 。(期间)
  • $(美元符号)
  • [(左方括号)
  • ](右方括号)
  • #(哈希或磅符号)
  • /(正斜杠)
我们可以使用JavaScript的一个内置编码函数,因为据我所知,Firebase不提供内置方法来实现这一点。下面是一个演练,看看哪一个对我们的目的最有效:

var forbiddenChars = '.$[]#/'; //contains the forbidden characters
escape(forbiddenChars); //results in ".%24%5B%5D%23/"
encodeURI(forbiddenChars); //results in ".%24%5B%5D%23%2F"
encodeURIComponent(forbiddenChars); //results in ".%24%5B%5D%23%2F"
显然,最有效的解决方案是
encodeURIComponent
。然而,它并不能解决我们所有的问题。
字符仍然会产生问题,如上面的测试所示,并尝试
编码组件
您的测试电子邮件地址。我的建议是在
encodeURIComponent
之后链接一个replace函数来处理周期

以下是两个示例案例的解决方案:

encodeURIComponent('Henry.Morgan@caribbean.sea').replace(/\./g, '%2E') //results in "Henry%2EMorgan%40caribbean%2Esea"
encodeURIComponent('02/10/2013'); //results in "02%2F10%2F2013"

由于这两个最终结果都可以安全地作为密钥名插入Firebase中,因此唯一需要考虑的是读取Firebase后的解码,这可以通过
replace(“%2E”,”)
和一个简单的
decodeURIComponent(…)

来解决,我自己也遇到了同样的问题,为此我创建了一个

与选择的答案不同,只编码不安全的字符(./[]#$)和%(由于编码/解码的工作方式而有必要)。 当
encodeURIComponent
将对其进行编码时,它会留下其他可以安全用作firebase密钥的特殊字符

以下是有关详细信息的源代码:

// http://stackoverflow.com/a/6969486/692528
const escapeRegExp = (str) => str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');


const chars = '.$[]#/%'.split('');
const charCodes = chars.map((c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);

const charToCode = {};
const codeToChar = {};
chars.forEach((c, i) => {
  charToCode[c] = charCodes[i];
  codeToChar[charCodes[i]] = c;
});

const charsRegex = new RegExp(`[${escapeRegExp(chars.join(''))}]`, 'g');
const charCodesRegex = new RegExp(charCodes.join('|'), 'g');

const encode = (str) => str.replace(charsRegex, (match) => charToCode[match]);
const decode = (str) => str.replace(charCodesRegex, (match) => codeToChar[match]);
我是为Java写这篇文章的(因为我来到这里期待Java实现):

公共静态字符串encodeForFirebaseKey(字符串s){
返回s
.替换(“uu”,“_uuu”)
.替换(“.”、“\P”)
.替换(“$”,“\u D”)
.替换(“#”和“#H”)
.替换(“[”,“_O”)
.替换(“]”,“_C”)
.替换(“/”,“\S”)
;
}
公共静态字符串decodeFromFirebaseKey(字符串s){
int i=0;
国际货币基金组织;
字符串res=“”;
而((ni=s.indexOf(“x”,i))!=-1){
res+=s.子串(i,ni);
如果(ni+1
我对这个问题很恼火,所以我从@sushain97(谢谢!)那里得到了答案,并构建了一个深度编码器/解码器

基本用法:

var firebaseKeyEncode = require('firebase-key-encode');
firebaseKeyEncode.encode('my.bad.key');
// Output: my%2Ebad%2Ekey
深度使用:

var firebaseKeyEncode = require('firebase-key-encode');

var badTree = {
    "pets": [
        {
            "jimmy.choo": 15}
        ],
    "other.key": 5
}

firebaseKeyEncode.deepEncode(badTree);

// Output: {
//    "pets": [
//        {
//            "jimmy%2Echoo": 15}
//        ],
//    "other%2Ekey": 5
// }

如果您使用的是Swift 3,这对我很有用(在操场上试试):


就我个人而言,我发现了一个简单易行的方法来解决我遇到的这个问题

我获取了
dateTime字符串
,并使用
replace(“/”,“|”)


结果将是这样的
2017 | 07 | 24 02:39:37
而不是
2017/07/24 02:39:37

,即使这不是OP要求的,
但根据我的经验,与其使用这些可疑的键,不如让
.push()
创建一个id,
和其他内容-电子邮件、日期等。另存为专用字段的内容

$id: {
   email: "Henry.Morgan@caribbean.sea"
}
注意:不要试图通过在密钥中插入应该包含的内容来节省音量。
过早优化是万恶之源(c)。

高效的c#实现(对于Unity和.net)。基于@josue.0的答案

公共静态字符串编码器FireBaseKey(字符串s){
StringBuilder sb=新的StringBuilder();
foreach(字符c在s中){
开关(c){
案例‘‘
某人加上;
打破
案例“$”:
某人附加(“_D”);
打破
案例“”:
某人附加(“_P”);
打破
案例“#”:
某人附加(“_H”);
打破
案例“[”:
s
var str = "this.is/a#crazy[string]right$here.$[]#/"

if let strEncoded = str.addingPercentEncoding(withAllowedCharacters: .alphanumerics) {
    print(strEncoded)

    if let strDecoded = strEncoded.removingPercentEncoding {
        print(strDecoded)
    }
}
$id: {
   email: "Henry.Morgan@caribbean.sea"
}