You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:38:17