在 C# 控制台应用程序中反序列化 JSON
Deserializing the JSON in the C# console application
我想反序列化来自 C# 控制台中 Web 服务调用的 JSON 响应 application.JSON 看起来像
{
"il_response": {
"custom_forms": [
{
"id": 84,
"name": "Request",
"note": "Notes",
"fields": [
{
"label": "Prj",
"value": [
"ABC",
"DEF"
],
"name": "Projects"
},
{
"label": "Submit Date",
"value": "October 16, 2017 ",
"name": "Submit Date"
},
{
"label": "Name",
"value": "Dhana",
"name": "Name"
}
]
}
],
"il_metadata": {}
}
}
我将所有 POCO 都放在名为 iDTO.cs
的单独 class 文件中
public class iResponse
{
public iResponse(){ }
public List<iDTO> data { get; set; }
}
public class iDTO
{
public iDTO() { }
}
public class Field
{
public string label { get; set; }
public object value { get; set; }
public string name { get; set; }
}
public class C_Form
{
public int id { get; set; }
public string name { get; set; }
public string note { get; set; }
public List<Field> fields { get; set; }
}
public class IlMetadata
{
}
public class IlResponse
{
public List<C_Form> c_forms { get; set; }
public IlMetadata il_metadata { get; set; }
}
public class RootObject
{
public IlResponse il_response { get; set; }
}
下面是我调用服务的代码
public class APICall
{
string BaseUR = ConfigurationManager.AppSettings["BaseURL"];
string accessToken = ConfigurationManager.AppSettings["AccessToken"];
public async Task<IHttpActionResult> Get()
{
using (var client = new HttpClient())
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
Uri uri = new Uri(BaseURL);
client.BaseAddress = uri;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
var response = await client.GetAsync(uri);
var datafile = await response.Content.ReadAsStringAsync();
var returnDataObj = JsonConvert.DeserializeObject<iLabDTO.RootObject>(datafile);
}
}
}
这里我不确定如何从 JSON 中的字段中获取每个名称和值 属性。我看到我们可以将 for each 与字段一起使用,但不确定如何同时获取值和名称
IlResponse
对象上的 c_forms
属性 需要与 JSON 对象上对应的 属性 同名:
{
"il_response": {
"custom_forms": [
从上面的代码片段中,您应该将 c_forms
属性 重命名为 custom_forms
。
这是我看到的该问题的唯一发生,但您需要确保所有 C# 属性 名称与收到的 JSON 对象名称相匹配。这将为您提供 属性 名称,因为它在您的 C# 模型对象中,以及将在运行时保存在命名 属性 中的值。
在修改了 Luke 提到的问题后,使用您的 json 成功了。但是我使用 iDTO.RootObject
而你的 api 说 iLabDTO.RootObject
.
string datafile = File.ReadAllText(@"json.txt");
var returnDataObj = JsonConvert.DeserializeObject<iDTO.RootObject>(datafile);
foreach (var form in returnDataObj.il_response.c_forms)
{
Console.WriteLine(form.id);
Console.WriteLine(form.name);
Console.WriteLine(form.note);
foreach(var field in form.fields)
{
Console.WriteLine(field.name);
Console.WriteLine(field.label);
Console.WriteLine(field.value);
}
}
我想反序列化来自 C# 控制台中 Web 服务调用的 JSON 响应 application.JSON 看起来像
{
"il_response": {
"custom_forms": [
{
"id": 84,
"name": "Request",
"note": "Notes",
"fields": [
{
"label": "Prj",
"value": [
"ABC",
"DEF"
],
"name": "Projects"
},
{
"label": "Submit Date",
"value": "October 16, 2017 ",
"name": "Submit Date"
},
{
"label": "Name",
"value": "Dhana",
"name": "Name"
}
]
}
],
"il_metadata": {}
}
}
我将所有 POCO 都放在名为 iDTO.cs
的单独 class 文件中public class iResponse
{
public iResponse(){ }
public List<iDTO> data { get; set; }
}
public class iDTO
{
public iDTO() { }
}
public class Field
{
public string label { get; set; }
public object value { get; set; }
public string name { get; set; }
}
public class C_Form
{
public int id { get; set; }
public string name { get; set; }
public string note { get; set; }
public List<Field> fields { get; set; }
}
public class IlMetadata
{
}
public class IlResponse
{
public List<C_Form> c_forms { get; set; }
public IlMetadata il_metadata { get; set; }
}
public class RootObject
{
public IlResponse il_response { get; set; }
}
下面是我调用服务的代码
public class APICall
{
string BaseUR = ConfigurationManager.AppSettings["BaseURL"];
string accessToken = ConfigurationManager.AppSettings["AccessToken"];
public async Task<IHttpActionResult> Get()
{
using (var client = new HttpClient())
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
Uri uri = new Uri(BaseURL);
client.BaseAddress = uri;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
var response = await client.GetAsync(uri);
var datafile = await response.Content.ReadAsStringAsync();
var returnDataObj = JsonConvert.DeserializeObject<iLabDTO.RootObject>(datafile);
}
}
}
这里我不确定如何从 JSON 中的字段中获取每个名称和值 属性。我看到我们可以将 for each 与字段一起使用,但不确定如何同时获取值和名称
IlResponse
对象上的 c_forms
属性 需要与 JSON 对象上对应的 属性 同名:
{
"il_response": {
"custom_forms": [
从上面的代码片段中,您应该将 c_forms
属性 重命名为 custom_forms
。
这是我看到的该问题的唯一发生,但您需要确保所有 C# 属性 名称与收到的 JSON 对象名称相匹配。这将为您提供 属性 名称,因为它在您的 C# 模型对象中,以及将在运行时保存在命名 属性 中的值。
在修改了 Luke 提到的问题后,使用您的 json 成功了。但是我使用 iDTO.RootObject
而你的 api 说 iLabDTO.RootObject
.
string datafile = File.ReadAllText(@"json.txt");
var returnDataObj = JsonConvert.DeserializeObject<iDTO.RootObject>(datafile);
foreach (var form in returnDataObj.il_response.c_forms)
{
Console.WriteLine(form.id);
Console.WriteLine(form.name);
Console.WriteLine(form.note);
foreach(var field in form.fields)
{
Console.WriteLine(field.name);
Console.WriteLine(field.label);
Console.WriteLine(field.value);
}
}