在C#.NET中为JArray内的device对象填充sourceSerialNumber字段
在C# .NET中为JSON数组内的device对象的sourceSerialNumber字段赋值
嘿,问题出在这儿了——你看你的JSON里device是一个数组(注意那对[]方括号),不是单个对象!所以你直接通过componentConfig.Config.deviceConfig.device拿到的是一个集合,自然没法直接通过.访问sourceSerialNumber字段。下面给你几种实用的解决办法:
1. 动态对象方式处理数组
既然device是数组,你只需要先定位到数组里的具体元素,再赋值就行:
// 假设你已经拿到了动态的config对象 dynamic config = componentConfig.Config.deviceConfig; // 如果只需要给第一个device赋值 config.device[0].sourceSerialNumber = "你的目标序列号"; // 如果有多个device需要批量赋值,遍历数组即可 foreach (var deviceItem in config.device) { deviceItem.sourceSerialNumber = "对应的序列号值"; }
2. 强类型序列化(推荐生产环境使用)
这种方式类型安全,不容易因为字段名拼写错误出问题,还能获得IDE的智能提示。先定义和JSON结构匹配的实体类:
// 顶层配置类 public class RootConfig { public string id { get; set; } public List<Device> device { get; set; } } // Device对象的实体类 public class Device { public bool contactlessEnabled { get; set; } public int dccTimeoutSecs { get; set; } public int debitKeyIndex { get; set; } public string defaultLanguage { get; set; } public string deviceType { get; set; } public string googleSecrets { get; set; } public int lineLength { get; set; } public string sourceSerialNumber { get; set; } // 和JSON字段名完全匹配 }
如果你习惯用C#的大驼峰命名,也可以用特性映射:
public class Device { [JsonPropertyName("contactlessEnabled")] public bool ContactlessEnabled { get; set; } // ...其他属性同理 [JsonPropertyName("sourceSerialNumber")] public string SourceSerialNumber { get; set; } }
然后进行反序列化、赋值、再序列化的操作:
// 假设你有JSON字符串,或者直接反序列化你的config对象 var rootConfig = JsonConvert.DeserializeObject<RootConfig>(yourJsonString); // 给第一个device赋值 rootConfig.device[0].sourceSerialNumber = "新的序列号"; // 遍历所有device赋值 foreach (var dev in rootConfig.device) { dev.sourceSerialNumber = "你的目标值"; } // 如果需要把修改后的对象转成JSON字符串 var updatedJson = JsonConvert.SerializeObject(rootConfig);
如果用.NET Core/.NET 5+自带的System.Text.Json,替换对应的序列化方法即可:
var rootConfig = JsonSerializer.Deserialize<RootConfig>(yourJsonString); // 赋值操作同上 var updatedJson = JsonSerializer.Serialize(rootConfig);
3. 用JObject直接操作(适合快速临时场景)
如果不想定义实体类,可以用Newtonsoft.Json的JObject直接定位字段修改:
// 解析JSON字符串为JObject JObject configObj = JObject.Parse(yourJsonString); // 给第一个device的sourceSerialNumber赋值 configObj["device"][0]["sourceSerialNumber"] = "你的序列号"; // 遍历所有device批量赋值 foreach (var deviceToken in configObj["device"].Children()) { deviceToken["sourceSerialNumber"] = "对应的值"; } // 转成修改后的JSON字符串 string updatedJson = configObj.ToString();
内容的提问来源于stack exchange,提问作者the_coder_in_me
相关产品推荐
相关产品推荐

