C# 为什么JsonConvert.DeserializeObject更改字符串值?
我从RESTWebAPI得到了正确的结果,但当我尝试反序列化结果时,它会将字符串值“034342323”更改为“7455955” 我的班级C# 为什么JsonConvert.DeserializeObject更改字符串值?,c#,json,rest,asp.net-web-api,json.net,C#,Json,Rest,Asp.net Web Api,Json.net,我从RESTWebAPI得到了正确的结果,但当我尝试反序列化结果时,它会将字符串值“034342323”更改为“7455955” 我的班级 public class DataModel { public int Id { get; set; } public string ABN { get; set; } public string AccountNumber { get; set; } } JSON结果 [{
public class DataModel
{
public int Id { get; set; }
public string ABN { get; set; }
public string AccountNumber { get; set; }
}
JSON结果
[{"Id":1,"ABN":"9949876532","AccountNumber":"034342323"}]
呼叫代码
using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
{
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsStringAsync();
result = result.Replace("\"", string.Empty).Trim();
result = result.Replace("\\", string.Empty).Trim();
var data = JsonConvert.DeserializeObject<IEnumerable<DataModel>>(result);
[...]
}
附加的
如果我不删除“”,它将无法理想化并抛出错误
{"Error converting value \"[{\"Id\":1,\"ABN\":\"9949876532\",\"AccountNumber\":\"034342323\"}]\" to type 'System.Collections.Generic.IEnumerable`1[DataModel]'
. Path '', line 1, position 174."}
Could not cast or convert from System.String to System.Collections.Generic.IEnumerable`1[DataModel].
解决方案
result = result.Replace("\"", "").Trim();
result = result.Replace("\\", "'").Trim(); //This line is the tricks
感谢安德鲁的解释。因此,我通过微小的修改克服了这个问题。这个行为是经过设计的:Json.Net将以“0”开头的整数字符串视为八进制数(
八进制34342323
==十进制7455955
):
生成json时,请查看添加AccountNumber的代码,确保删除前导的
“0”
,但只有在他删除引号后,才会开始这样解释。只要它是字符串(用引号括起来),它就不重要了,对吗?是的。请看第3节这里这听起来像是目击的行为,但它看起来根本不是设计的-它看起来像一个bug。您链接到的工作项谈到数字,在OP的例子中,数字是反序列化字符串的。@BenjaminGruenbaum,OP删除代码中的引号,意思是“AccountNumber”:“034342323”
变成AccountNumber:034342323
,json.net开始将数字处理为八进制@Andrew:如果我需要0,他们有什么办法吗?
result = result.Replace("\"", "").Trim();
result = result.Replace("\\", "'").Trim(); //This line is the tricks