使用Json.NET在C#反序列化JSON时localAddress字段无法显示
问题分析与解决方案
你遇到的localAddress字段无法在DataGridView中显示的核心原因是实体类结构与JSON数据的层级不匹配,具体问题和修复步骤如下:
1. 核心问题:JSON层级与实体类的映射错误
先看你的JSON示例结构,localAddress是嵌套在network对象下的子字段:
{ // ...其他根级字段 "network": { "localAddress": "192.168.1.3:8298", "remoteAddress": "213.32.53.162:31337" } }
但你的per类直接把localAddress定义成了根级属性,还注释掉了[JsonProperty("network")]特性——这就导致Json.NET无法识别network这个嵌套对象,自然读不到里面的localAddress值。
2. 修复实体类结构
你需要创建一个对应network对象的嵌套类,再在主类中正确映射这个层级:
// 新增嵌套类,对应JSON里的network对象 public class Network { public string localAddress { get; set; } public string remoteAddress { get; set; } } public class per { // 启用JsonProperty特性,绑定JSON中的network字段 [JsonProperty("network")] public Network Network { get; set; } public string id { get; set; } public string name { get; set; } }
3. 修正UI绑定与代码笔误
你的按钮点击事件里还有个小笔误:反序列化得到的变量是peer,但赋值时用了peers.Result,需要统一变量名。另外如果要在DataGridView中直接显示localAddress,可以通过两种方式处理:
- 方式一:手动指定DataGridView列的数据源字段为
Network.localAddress - 方式二:在
per类中添加只读属性包装Network.localAddress,方便直接绑定
示例修正后的按钮事件代码:
private void button2_Click(object sender, EventArgs e) { // 注意:如果你的JSON是单个对象而非数组,要去掉List<> var peers = JsonConvert.DeserializeObject<List<per>>(richTextBox1.Text); dataGridView2.DataSource = peers; // 手动指定列绑定(假设你已添加名为localAddressCol的列) dataGridView2.Columns["localAddressCol"].DataPropertyName = "Network.localAddress"; }
额外提示
如果你的JSON是单个对象而非数组,要把反序列化代码改成JsonConvert.DeserializeObject<per>(richTextBox1.Text),再用new List<per> { 反序列化后的对象 }作为数据源绑定到DataGridView。
内容的提问来源于stack exchange,提问作者Gy9vin
相关产品推荐
相关产品推荐

