我正在尝试使用我的web api,它从我的asp.net mvc Web应用程序返回JSON格式。因为我的JSON格式有根节点(我填充oledb数据集的方式)。我一直收到以下错误。
无法反序列化当前的JSON对象(例如{" name":" value"}) 进入类型' System.Collections.Generic.List' 1 [FileAttributes]'因为 该类型需要一个JSON数组(例如[1,2,3])来反序列化 正确。要修复此错误,请将JSON更改为JSON数组 (例如[1,2,3])或更改反序列化类型以使其正常 .NET类型(例如,不是整数的基本类型,不是集合 类似于数组或
List<T>
),可以从JSON反序列化 宾语。 JsonObjectAttribute也可以添加到类型中以强制它 从JSON对象反序列化。路径&#39; SearchData&#39;,第1行,位置 14。
以下是代码示例
string Baseurl = "http://localhost:62602/";
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage Res = await client.GetAsync("api/FileSearch/?searchTerm=" + searchTerm );
if (Res.IsSuccessStatusCode)
{
var fsResponse = Res.Content.ReadAsStringAsync().Result;
List<FileAttributes> fileAttribultes = JsonConvert.DeserializeObject<List<FileAttributes>>(fsResponse);
}
然后根据一些想法,我使用JSON.Parse
和SelectToken
来删除根节点,但这次List<FileAttributes>
返回数据但值为空值
JToken jtok = JObject.Parse(fsResponse).SelectToken("SearchData");
List<FileAttributes> fileAttribultes = JsonConvert.DeserializeObject<List<FileAttributes>>(fsResponse);
这是我的FileAttributes类
public class FileAttributes
{
public string Name { get; set; }
public string Header { get; set; }
public string Title { get; set; }
}
我很感激,如果有人在使用根节点反序列化JSON部分时检查了什么错误,并且有正确的方法吗?
从POSTMAN输出复制
{ "SearchData": [ { "SYSTEM.NAME": "FILE NAME 1" , "SYSTEM.HEADER": "HEADER 1", "SYSTEM.TITLE": "TITLE 1", }, { "SYSTEM.NAME": "FILE NAME 1" , "SYSTEM.HEADER": "HEADER 1", "SYSTEM.TITLE": "TITLE 1", }, { "SYSTEM.NAME": "FILE NAME 1" , "SYSTEM.HEADER": "HEADER 1", "SYSTEM.TITLE": "TITLE 1", }] }
答案 0 :(得分:1)
基于JSON,需要更新对象模型以匹配。还需要包含JsonProperty
属性以将JSON键与类的属性相匹配。
public class FileAttributes {
[JsonProperty("SYSTEM.NAME")]
public string Name { get; set; }
[JsonProperty("SYSTEM.HEADER")]
public string Header { get; set; }
[JsonProperty("SYSTEM.TITLE")]
public string Title { get; set; }
}
public class RootObject {
public IList<FileAttributes> SearchData { get; set; }
}
然后相应地更新对服务的调用
string Baseurl = "http://localhost:62602/";
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync("api/FileSearch/?searchTerm=" + searchTerm );
if (response.IsSuccessStatusCode) {
var json = await response.Content.ReadAsStringAsync();
RootObject result = JsonConvert.DeserializeObject<RootObject>(json);
var fileAttribultes = result.SearchData;
//...
}