在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}
如您所见,联系人字段是:
- 一个字符串(用逗号分隔的项目)
- 一串字符串。
我想转换为这个类:
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’不支持反序列化数组。
什么是反序列化处理以下情况的最佳方法:
- 一个字符串
- 一串字符串。
对于联系人字段。 我很乐意提出所需的任何条件逻辑。 。
我试过这个:
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(',');