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

C#桌面应用中无法反序列化特定JSON的问题求助

C#中反序列化服务器JSON数据时遇到JsonReaderException问题

目标JSON结构

{
"panicForms": [{
    "name": "Name",
    "description": "Description",
    "title": "Title",
    "Image": "",
    "keyboardShortcut": "",
    "instructions": "Instructions",
    "submitButtonText": "",
    "label": "",
    "tooltip": "",
    "textColor": "Black",
    "backgroundColor": "Red",
    "textStyle": "Normal",
    "systemTrayEnabled": true,
    "fields": [{
            "eventField": "Name",
            "label": "Full Name",
            "type": "single selection",
            "required": true
        },
        {
            "eventField": "Age",
            "label": "age",
            "type": "single selection",
            "required": false
        }
    ]
}]
}

对应实体类定义

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Field
{
    public string eventField { get; set; }
    public string label { get; set; }
    public string type { get; set; }
    public bool required { get; set; }
}

public class PanicForm
{
    public string name { get; set; }
    public string description { get; set; }
    public string title { get; set; }
    public string Image { get; set; }
    public string keyboardShortcut { get; set; }
    public string instructions { get; set; }
    public string submitButtonText { get; set; }
    public string label { get; set; }
    public string tooltip { get; set; }
    public string textColor { get; set; }
    public string backgroundColor { get; set; }
    public string textStyle { get; set; }
    public bool systemTrayEnabled { get; set; }
    public List<Field> fields { get; set; }
}

public class Root
{
    public List<PanicForm> panicForms { get; set; }
}

尝试过的反序列化代码

  • 尝试1:
var stuff1 = JsonConvert.DeserializeObject<PanicForm[]>(jsonString1);
  • 尝试2:
var stuff1 = JsonConvert.DeserializeObject<List<PanicForm>>(jsonString1);
  • 尝试3:
var stuff1 = JsonConvert.DeserializeObject<Root>(jsonString1);
  • 尝试4:
var stuff1 = JsonConvert.DeserializeObject<PanicForm>(jsonString1);
  • 尝试5:
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(jsonString1);

错误信息

所有尝试均抛出相同异常:

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: s. Path '', line 0, position 0.'

堆栈跟踪:

at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
   at TestDynamicControls.Form1..ctor() in C:\Alertus\PanicUI\TestDynamicControls\TestDynamicControls\Form1.cs:line 58
   at TestDynamicControls.Program.Main() in C:\Alertus\PanicUI\TestDynamicControls\TestDynamicControls\Program.cs:line 19

解决方案

这个异常的核心原因是传入JsonConvert.DeserializeObject的jsonString1并非有效的JSON格式,开头的字符s说明字符串可能是服务器返回的错误信息(比如"Server Error")、空字符串、或者带有非JSON前缀的内容。

排查步骤:

  1. 验证输入字符串内容:在反序列化前,通过调试输出或弹窗查看jsonString1的实际值,确认是否为预期的JSON。例如:
Debug.WriteLine(jsonString1);
MessageBox.Show(jsonString1);
  1. 检查服务器响应状态:确认HTTP请求返回的状态码为200 OK,响应内容类型为application/json。如果状态码是4xx/5xx,服务器返回的可能是错误页面而非JSON。
  2. 处理编码问题:确保读取服务器响应时使用正确的编码(通常为UTF-8),避免因编码错误导致JSON字符串损坏。例如:
using (var reader = new StreamReader(responseStream, Encoding.UTF8))
{
    jsonString1 = reader.ReadToEnd();
}
  1. 移除BOM标记:如果JSON字符串开头包含UTF-8 BOM(\ufeff),会导致解析失败,可通过以下代码清理:
jsonString1 = jsonString1.TrimStart('\ufeff');
  1. 确认实体类匹配:你的实体类与JSON结构匹配度没问题,但如果后续仍有字段映射问题,可使用[JsonProperty]特性显式绑定字段名,例如:
public class Root
{
    [JsonProperty("panicForms")]
    public List<PanicForm> PanicForms { get; set; }
}

内容的提问来源于stack exchange,提问作者Zaveed Abbasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:03:20