如何在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"。

谢谢你的帮助。

如何在c#中使用JsonConvert处理错误的Json响应

无论属性中是否有空值,这都将起作用。

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