将JSON转换为C#类

时间:2016-03-03 22:37:07

标签: c# json

我有这个JSON字符串:

[{"fkp_keyword":"CLI_RID"},
 {"fkp_keyword":"DOC_NAME"},
 {"fkp_keyword":"FILENAME"},
 {"fkp_keyword":"PRINT_DATE"},
 {"fkp_keyword":"EVENT_CODE"},
 {"fkp_keyword":"CONFL_RID"},
 {"fkp_keyword":"PROGRAM_CODE"},
 {"fkp_keyword":"CES"},
 {"fkp_keyword":"DISTR"},
 {"fkp_keyword":"REC_DATE"},
 {"fkp_keyword":"REC_RID"},
 {"fkp_keyword":"PFL_RID"},
 {"fkp_keyword":"DES"},
 {"fkp_keyword":"CER_RID"}
]

我需要将它转换为下面的类kw的列表。

说明:

public class kw
{
    public string fkp_keyword { get; set; }
}

但是这段代码:

List<kw> header = new List<kw>();
using (WebClient client = new WebClient())
{
    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string result = client.DownloadString(parms);
    header = JsonConvert.DeserializeObject<List<kw>>(result);
}

该调用返回上面的JSON字符串,但在尝试转换它时,上面的代码返回此异常: Error converting value to type 'System.Collections.Generic.List[LA.Models.kw]

更新

我将定义更改为:

public class kwList
{
    public kw[] Property1 { get; set; }
}
public class kw
{
    public string fkp_keyword { get; set; }
}

以及此代码:

kwList header = new kwList();
using (WebClient client = new WebClient())
{
    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string result = client.DownloadString(parms);
    header = JsonConvert.DeserializeObject<kwList>(result);
}

但现在我得到了这个例外:
Could not cast or convert from System.String to LicenseeArchive.Models.kwList.

我做错了什么?

2 个答案:

答案 0 :(得分:1)

无论出于何种原因,该URL返回的JSON字符串似乎是双序列化的。也就是说,它包含额外的反斜杠以转义所有引号,从而阻止它被正确地反序列化为对象数组。这就是你收到错误的原因。

要解决此问题,您可以将其反序列化两次:首先取消JSON,第二次对您的类进行“真正的”反序列化。从长远来看,您可能还希望与API的提供商联系,看看他们是否会修复他们的JSON。

List<kw> header = new List<kw>();
using (WebClient client = new WebClient())
{
    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string result = client.DownloadString(parms);
    string unescapedJson = JsonConvert.DeserializeObject<string>(result);
    header = JsonConvert.DeserializeObject<List<kw>>(unescapedJson);
}

小提琴:https://dotnetfiddle.net/XEULdy

答案 1 :(得分:0)

您提供的JSON字符串可以加载您的第一个类定义:

public class kw
{
  public string fkp_keyword { get; set; }
}

示例:

string example = "[{\"fkp_keyword\":\"CLI_RID\"}, {\"fkp_keyword\":\"DOC_NAME\"}, {\"fkp_keyword\":\"FILENAME\"}]";
List<kw> kws =  JsonConvert.DeserializeObject<List<kw>>(example);

也许您没有提供所有细节。或者你的json字符串看起来不一样。