在C#中,当一个字段可能是字符串或字符串数​​组时,如何反序列化此json?

我有一个asp.net-mvc网站,我正在从数据库中读取Json字符串。 以下是DB中的以下json。 它可能看起来像这样:

{"description": "Test", "contacts": ["joe@gmail.com", "bill@yahoo.com"], "enabled": true} 

或这个:

 {"description": "Test", "contacts": "joe@gmail.com, bill@yahoo.com", "enabled": true} 

如您所见,联系人字段是:

  1. 一个字符串(用逗号分隔的项目)
  2. 一串字符串。

我想转换为这个类:

 public class MyJob { public string description; public string[] contacts; public string enabled; } 

当我尝试使用JavascriptSerializer()仅指定一个字符串(将上面的内容更改为:public string contacts;)时:

 var serializer = new JavaScriptSerializer(); string contacts = serializer.Deserialize(theAboveJsonString).contacts; 

我在它的数组的情况下得到这个错误: 类型’System.String’不支持反序列化数组。

什么是反序列化处理以下情况的最佳方法:

  1. 一个字符串
  2. 一串字符串。

对于联系人字段。 我很乐意提出所需的任何条件逻辑。 。

我试过这个:

  var contacts = serializer.Deserialize(theAboveJsonString).contacts; if (contacts is string) { jobInfo.contacts = contacts; } else { jobInfo.contacts = String.Join("; ", contacts ); } 

但这似乎没有解决,因为我仍然得到上面的错误,当它的数组

尝试

  var contacts = (new JavaScriptSerializer().DeserializeObject(theAboveJsonString) as Dictionary)["contacts"]; if (contacts is object[]) { jobInfo.contacts = String.Join("; ", contacts as object[]); } else { jobInfo.contacts = contacts.ToString(); } 

有关参考,请参阅MSDN和此处 。

您可能对此处的一些细节感兴趣: JSON.net – 字段是字符串或List

如果您愿意使用Json.NET,请具备以下function:

 public string[] getAsArray(JToken token) { if (token.HasValues) { return token.Select(m => string(m)).ToArray(); } else { return ((string)token).Split(",").Select(s => s.Trim()).ToArray(); } } 

然后用法:

 var json = "..."; JObject o = JObject.Parse(json); string[] contacts = getAsArray(o["contacts"]); 

对于任一JSON,结果应该相同。

尝试将联系人反序列化为字符串数组而不是纯字符串:

 string[] contacts = serializer.Deserialize(theAboveJsonString).contacts; 

如果JSON变量持有普通字符串,请使用:

 string[] contacts = serializer.Deserialize(theAboveJsonString).contacts.Split(',');