在C#我怎么可以反序列化JSON这个时候一个领域可能是一个字符串或字符串数​​组?(In C# ho

2019-06-23 14:27发布

我有一个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():

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

我得到在其阵列中的情况下,这个错误: 类型“System.String”不支持数组的反序列化。

什么是去了解这个反序列化处理的情况下,最好的方法:

  1. 字符串
  2. 字符串的数组。

联系人场。 我很高兴地把所需要的任何条件逻辑。 。

我尝试这样做:

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

但这似乎并没有解决,因为我仍然得到它时,一个数组上述错误

Answer 1:

尝试

  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和这里 。



Answer 2:

您可能感兴趣的一些细节在这里: 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的结果应该是一样的。



Answer 3:

尝试反序列化接点插入一个字符串数组,而不是纯字符串:

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

如果JSON变量被保持纯字符串,使用:

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


文章来源: In C# how can I deserialize this json when one field might be a string or an array of strings?