在 C# 中,当一个字段可能是字符串或字符串数组时,如何反序列化此 json
本文关键字:字符串 数组 json 反序列化 字段 一个 | 更新日期: 2023-09-27 18:30:56
我有一个 asp.net-mvc网站,我正在从数据库中读取Json字符串。下面是数据库中的以下 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():
var serializer = new JavaScriptSerializer();
string contacts = serializer.Deserialize<MyJob>(theAboveJsonString).contacts;
在数组的情况下,我会收到此错误:数组的反序列化不支持类型"System.String"。
反序列化它以处理以下情况的最佳方法是什么:
- 一个字符串
- 字符串数组。
对于联系人字段。 我很乐意放置所需的任何条件逻辑..
我试过这个:
var contacts = serializer.Deserialize<MyJob>(theAboveJsonString).contacts;
if (contacts is string)
{
jobInfo.contacts = contacts;
}
else
{
jobInfo.contacts = String.Join("; ", contacts );
}
但这似乎没有解决,因为当它是一个数组时,我仍然收到上面的错误
试试
var contacts = (new JavaScriptSerializer().DeserializeObject(theAboveJsonString) as Dictionary<string, object>)["contacts"];
if (contacts is object[])
{
jobInfo.contacts = String.Join("; ", contacts as object[]);
}
else
{
jobInfo.contacts = contacts.ToString();
}
有关参考,请参阅 MSDN 和此处。
您可能
对此处的一些详细信息感兴趣:JSON.net - 字段是字符串或列表<字符串>字符串>
如果您愿意使用 Json.NET,请使用以下功能:
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<MyJob>(theAboveJsonString).contacts;
如果 JSON 变量包含纯字符串,请使用:
string[] contacts = serializer.Deserialize<MyJob>(theAboveJsonString).contacts.Split(',');