NET中的JSON反序列化问题

时间:2019-05-11 18:05:48

标签: .net json

我有一个提供一些JSON的Web API。我已经检查了Postman中的结果以验证它们看起来正确。这是它返回的字符串:

[{"TranId":"1","Cost":"15.50","Distance":"0.0559887","StatusCode":"Arrived","TimeAccepted":"2019-05-11T17:49:08.197"}]

然后我有一个Xamarin应用程序,试图从API读取结果。这是我进行API调用的代码:

var client = new HttpClient();

client.BaseAddress = new Uri("https://...");

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.GetAsync("1");
if (response.IsSuccessStatusCode)
  {
    string result = await response.Content.ReadAsStringAsync();
    return result;
  }

由于某些原因,结果在“本地”窗口中看起来像这样:

"\"[{\\\"TranId\\\":\\\"1\\\",\\\"Cost\\\":\\\"15.50\\\",\\\"Distance\\\":\\\"0.0559887\\\",\\\"StatusCode\\\":\\\"Arrived\\\",\\\"TimeA…"

我尝试使用此行将其反序列化:

List<RootObject> customers = JsonConvert.DeserializeObject<List<RootObject>>(json, new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore});

我使用了一个工具来创建RootObject,并且所有列都设置为字符串。

public class RootObject
    {
        [JsonProperty("TranId")]
        public string TranId { get; set; }
      ...

我不断收到的错误是这样的:

Newtonsoft.Json.JsonSerializationException: Error converting value "[{"TranId":"1", ...  }]" to type 'System.Collections.Generic.List`1[Fleet.Views.OrderDetails+RootObject]'. Path '', line 1, position 372.

如果我用字符串手动替换json变量,则反序列化将起作用。但是在“本地”窗口中,引号前面只有一个反斜杠。我不明白为什么他们要有3个反斜杠。有什么建议吗?

编辑: 这是端点的代码:

ArrayList objs = new ArrayList();
while (reader.Read())
{
    objs.Add(new
    {
        TranId = reader["TranId"],
        Cost = reader["Cost"],
        Distance = reader["Distance"],
        StatusCode = reader["StatusCode"],
        TimeAccepted = reader["TimeAccepted"]

    });
}

returnValue = JsonConvert.SerializeObject(objs);

此外,如果我尝试将字符串列表反序列化为字符串,则会收到此错误:

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

1 个答案:

答案 0 :(得分:0)

感谢您指出正确的方向。端点返回ActionResult<string>,所以我将其更改为字符串并重新发布。 (我不确定这是否有所作为。)

响应中的确还有多余的反斜线,以及整个引号。我必须单独检查前几个字符才能找到它,因为即使是放大镜选项也没有显示多余的引号。通过删除这些,终于可以了!

json = json.Replace("\\", "");
json = json.Substring(1, json.Length - 2);