使用asp.net web.api json无法正常工作

时间:2017-10-05 16:10:24

标签: c# asp.net-web-api json.net

我正在尝试使用我的web api,它从我的asp.net mvc Web应用程序返回JSON格式。因为我的JSON格式有根节点(我填充oledb数据集的方式)。我一直收到以下错误。

  

无法反序列化当前的JSON对象(例如{&#34; name&#34;:&#34; value&#34;})   进入类型&#39; System.Collections.Generic.List&#39; 1 [FileAttributes]&#39;因为   该类型需要一个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.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部分时检查了什么错误,并且有正确的方法吗?

从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", }] }

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; 
    //...
}