C#将JSON字符串写入Firestore时值变为空数组的问题
解决Firestore写入JObject后值为空数组的问题
咱们一步一步来排查和解决这个问题:
1. 先修复JSON字符串的语法错误
你写的JSON字符串有两个明显的语法问题,这大概率是导致后续解析异常、写入Firestore出现空值的根源:
property1的引号没闭合:你写的是'property1: 'myvalue',正确的应该是键名用引号包裹,冒号在引号外面,也就是'property1': 'myvalue'- 标准JSON要求用双引号包裹键和字符串值,单引号是不被标准JSON解析器认可的
修正后的JSON字符串可以这么写(用转义双引号):
var jsonstr = "{ \"property1\": \"myvalue\", \"property2\": 2 }";
或者用C#的逐字字符串(@开头),避免转义的麻烦:
var jsonstr = @"{""property1"": ""myvalue"", ""property2"": 2}";
2. 验证JObject解析结果是否正确
在写入Firestore之前,先确认JObject.Parse后的结果是正确的,避免解析出异常结构:
JObject json2 = JObject.Parse(jsonstr); Console.WriteLine(json2.ToString()); // 打印出来看看,应该能看到正确的键值对:{"property1":"myvalue","property2":2}
如果这里输出的结构不对,那肯定是JSON字符串的问题,先把这一步搞定。
3. 调整Firestore的写入方式
直接传入JObject有时候会因为Firestore的序列化逻辑导致异常,建议把JObject转换成Firestore更兼容的Dictionary<string, object>类型:
// 转换为字典 var dataDict = json2.ToObject<Dictionary<string, object>>(); // 一定要await异步操作,否则可能操作还没完成程序就结束了 await collection.Document("test2").SetAsync(dataDict);
另外,务必不要忘记await异步方法,如果直接调用SetAsync不等待,程序可能在写入操作完成前就退出,看起来像是写入了空值,但实际是操作没执行完。
4. 更稳妥的方式:使用强类型对象
如果你的数据结构是固定的,定义一个对应的类来序列化数据会更直观,也不容易出错:
// 定义数据类 public class MyDataModel { public string Property1 { get; set; } public int Property2 { get; set; } } // 反序列化到类对象 var myData = JsonConvert.DeserializeObject<MyDataModel>(jsonstr); // 写入Firestore await collection.Document("test2").SetAsync(myData);
按照这个流程走,应该就能解决写入后值为空数组的问题了。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

