如何使用JsonConvert

时间:2015-10-15 23:56:45

标签: c# json

我正在使用Web服务来获取响应,并发现Json的格式不正确。请参阅以下示例。

对象结构是:

  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”然后检查对象,如果它不是属性,则将其作为值放入前一个字段“收信地址“ 。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

无论属性中的空值如何,这都将起作用。

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