如何在c#中使用JsonConvert处理错误的Json响应
本文关键字:错误 处理 Json 响应 JsonConvert | 更新日期: 2023-09-27 18:17:59
我使用web服务来获取响应,发现Json格式不正确。请看下面的样品。
Object结构为:
public class Action
{
public string serialNumber { get; set; }
public string method1 { get; set; }
public string recipient1 { get; set; }
public string notifyon1 { get; set; }
}
我们有一个字段"recipient1",其值为"1@test.com,2@test.com,3@test.com",然后api响应json如下所示。
错误的json响应:
{"serialNumber": "2471",
"method1": "email",
"recipient1": "1@test.com",
"2@test.com": "",
"3@test.com": "",
"notifyon1": "warning",
"critical": ""}
应该是:
{"serialNumber": "2471",
"method1": "email",
"recipient1": "1@test.com,2@test.com,3@test.com",
"notifyon1": "warning,critical"}
首先,我试图使用正则表达式将这些电子邮件值转换为正确的字段。但是后来我发现它发生在所有包含逗号","的值上。如上面示例中的" Notifyon1 "。
现在我在想,如果有任何方法我可以做解析json,当它找到"2@test.com"然后检查对象,如果它不是一个属性然后把它作为一个值到以前的字段"recipient1"。
谢谢你的帮助。
无论属性中是否有空值,这都将起作用。
using Newtonsoft.Json;
private Action HandleBadJson(string badJson)
{
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(badJson);
Action act = new Action();
List<string> propertyNames = act.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Select(p => p.Name).ToList();
string currentProperty = "";
foreach (var keyValPair in dictionary)
{
if (propertyNames.Contains(keyValPair.Key))
{
currentProperty = keyValPair.Key;
act.GetType().GetProperty(currentProperty).SetValue(act, keyValPair.Value);
continue;
}
else
{
var currentValue = act.GetType().GetProperty(currentProperty).GetValue(act, null);
string value = currentValue + "," + keyValPair.Key;
value = value.Trim(',');
act.GetType().GetProperty(currentProperty).SetValue(act, value);
}
}
return act;
}