无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误

Posted

技术标签:

【中文标题】无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误【英文标题】:Unable to deserialize the JSON result in C#. Input string is not in a correct format error 【发布时间】:2013-12-11 10:30:58 【问题描述】:

我正在尝试将 json 输出反序列化为 C# 对象。 JSON 结果:

"order":"commission":3.490000,"cost":4.490000,"duration":"day","extended_hours
":false,"fees":0.000000,"class":"equity","price":1.000000,"quantity":1.000000,"r
equest_date":"2013-11-26T09:43:17.118Z","result":true,"side":"buy","status":"ok"
,"symbol":"DIS","type":"limit"

我从 JSON 派生的类:

    public class Rootobject

    public Order Order  get; set; 


public class Order

    public float commission  get; set; 
    public float cost  get; set; 
    public string duration  get; set; 
    public bool extended_hours  get; set; 
    public int fees  get; set; 
    public string _class  get; set; 
    public int price  get; set; 
    public int quantity  get; set; 
    public DateTime request_date  get; set; 
    public bool result  get; set; 
    public string side  get; set; 
    public string status  get; set; 
    public string symbol  get; set; 
    public string type  get; set; 

用于反序列化的代码(来自 Newtonsoft 的 JSON.NET):

 Rootobject ord = JsonConvert.DeserializeObject<Rootobject>(responsebody);

我收到以下错误。

 Unhandled Exception: System.FormatException: Input string was not in a correct format.
   at Newtonsoft.Json.Utilities.ConvertUtils.Int32Parse(Char[] chars, Int32 start, Int32 length)
   at Newtonsoft.Json.JsonTextReader.ParseNumber()
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonTextReader.ReadInternal()
   at Newtonsoft.Json.JsonReader.ReadAsInt32Internal()
   at Newtonsoft.Json.JsonTextReader.ReadAsInt32()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(Jso
nReader reader, JsonContract contract, Boolean hasConverter)

我尝试将反序列化的结果保存到一个“动态”对象,它工作正常。但我不想使用动态对象来映射字段。

请指教。

注意:第 3 方 API 还发送一个名为“类”的字段。当我尝试直接调用该字段时出现编译时错误,我该如何调用它。

【问题讨论】:

【参考方案1】:

您在Order 类中将fees 属性定义为int,但在JSon 文本中它是0.00000,即floatdouble。我认为您可能需要将 fees 属性设置为 float 才能正确解析它。 pricequantity 属性看起来也一样。

【讨论】:

我是多么愚蠢.. 试图解决太多问题 :-(。感谢 **TONN ** 杰克。再次感谢!!! 另外我怎样才能调用字段“类”以便将其分配给内部字段? 如果您查看 JSON 结果,API 将返回一个名为“class”的字段。现在,当我尝试阅读相同的内容(下面的代码)时,我得到一个编译错误,因为“类”是一个关键字。 Console.WriteLine("Order Class : Class: 0", ord.Order.class); 一个解决方案立即浮现在脑海中,它巧妙地避免了一些 Json 序列化程序 foo 是将 json 文本中 class 的名称更改为不与保留字冲突的名称,例如root。我确信有更好的方法,但可以避免卡在它上面,你以后可以随时修复它。您可以为此使用 reg 表达式。 再次感谢杰克。我将使用我重命名的 _class。拯救了我的一天。谢谢!!!

以上是关于无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中反序列化 JSON 数组

jQuery/ASMX:在 C# 中反序列化 JSON 时出错

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

[C#]如何使用Newton.Json从流中反序列化json数据

如何在 C# .NET 中反序列化复杂的 JSON 对象?

如何在 C++ 非托管代码 Json 中反序列化一个字节 [] 的 json 字符串?