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

时间:2012-04-13 13:20:26

标签: c# json deserialization javascriptserializer

我有一个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. 一串字符串。
  3. 我想转换为这个类:

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

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

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

    我在数组的情况下遇到此错误:类型'System.String'不支持反序列化数组。

    最好的方法是将其反序列化以处理以下情况:

    1. 一个字符串
    2. 一串字符串。
    3. 表示联系人字段。我很乐意提出任何条件逻辑。

      我试过了:

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

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

3 个答案:

答案 0 :(得分:2)

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

有关参考,请参阅MSDNhere

答案 1 :(得分:0)

您可能会对此处的一些详细信息感兴趣:JSON.net - field is either string or List<string>

如果您愿意使用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,结果都应该相同。

答案 2 :(得分:-2)

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

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

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

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