2017-10-05 41 views
2

我想消费我的web api,它从我的asp.net mvc web应用程序返回JSON格式。由于我的JSON格式有根节点(我填充oledb数据集的方式)。我一直在收到以下错误。消费asp.net web.api json不工作

无法反序列化当前JSON对象(例如{ “名称”: “值”}) 成型 'System.Collections.Generic.List'1 [FileAttributes]' 因为 类型需要JSON阵列(例如[1,2,3])来正确地反序列化 。要解决这个错误,可以将JSON更改为JSON数组(例如[1,2,3]),或者更改反序列化类型,使其成为正常的 .NET类型(例如,不是像integer这样的基本类型,也不是集合 类型像一个数组或List<T>),可以从JSON 对象反序列化。 JsonObjectAttribute也可以添加到类型中,以强制它从一个JSON对象反序列化。路径“SearchData”,第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.ParseSelectToken以除去根节点,但此时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部分与根节点的反序列化和什么是正确的方法来做到这一点?

基于对象模型需要被更新以匹配JSON从邮差输出

{ "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

什么是JSON是什么样子?错误信息实际上告诉你你需要做什么来解决问题。 – Nkosi

+0

糟糕对不起,忘了提及JSON示例。 [ { “SYSTEM.NAME” :: “FILE NAME 1”, “SYSTEM.HEADER”: “HEADER 1”, “SYSTEM.TITLE”:从邮差输出 '{ “SearchData” 复制“TITLE 1" , }, \t \t { “SYSTEM.NAME”: “FILE NAME 1”, “SYSTEM.HEADER”: “HEADER 1”, “SYSTEM.TITLE”: “标题1”, }, \t \t { “SYSTEM.NAME”:“FILE NAME 1”, “SYSTEM.HEADER “:”HEADER 1“, ”SYSTEM“。TITLE“:”TITLE 1“, }] }' – user2178604

回答

1

复制。其中还需要包含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; 
    //... 
}