我有一个提供一些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.
答案 0 :(得分:0)
感谢您指出正确的方向。端点返回ActionResult<string>
,所以我将其更改为字符串并重新发布。 (我不确定这是否有所作为。)
响应中的确还有多余的反斜线,以及整个引号。我必须单独检查前几个字符才能找到它,因为即使是放大镜选项也没有显示多余的引号。通过删除这些,终于可以了!
json = json.Replace("\\", "");
json = json.Substring(1, json.Length - 2);