4

我有一个 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}

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

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

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

4

3 回答 3

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

有关参考,请参阅MSDN此处

于 2012-04-13T13:50:24.517 回答
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,结果应该是相同的。

于 2012-04-13T13:47:58.590 回答
-2

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

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

如果 JSON 变量包含纯字符串,请使用:

string[] contacts = serializer.Deserialize<MyJob>(theAboveJsonString).contacts.Split(',');
于 2012-04-13T13:32:31.093 回答