В C # как я могу десериализовать этот JSON, когда одно поле может быть строкой или массивом строк?

У меня есть сайт asp.net-mvc, и я читаю строку Json из базы данных. Вот следующий JSON в БД. Это может выглядеть так:

<code>{"description": "Test", "contacts": ["[email protected]", "[email protected]"], "enabled": true}
</code>

или это:

<code>{"description": "Test", "contacts": "[email protected], [email protected]", "enabled": true}
</code>

так что, как вы можете видеть, поле для контактов либо:

a string (with items separated by commas) an array of strings.

Я хочу преобразовать в этот класс:

<code>public class MyJob
{
    public string description;
    public string[] contacts;
    public string enabled;
}
</code>

когда я пытаюсь назначить только строку (изменив вышеприведенное на следующее: public string contacts; ) с помощью JavascriptSerializer ():

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

Я получаю эту ошибку в случаях, когда это массив:Type 'System.String' is not supported for deserialization of an array.

Каков наилучший способ десериализации этого для обработки случая:

a string an array of strings.

для поля контакта. Я счастлив поставить любую условную логику, необходимую. ,

Я попробовал это:

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

но это, похоже, не исправило, так как я все еще получаю ошибку выше, когда это массив

 StriplingWarrior13 апр. 2012 г., 15:32
Я не думаю, что вы могли бы написать сценарий для последовательного кодирования этих значений в базе данных?
 leora13 апр. 2012 г., 15:35
к сожалению нет . я не владею БД или данными

Ответы на вопрос(3)

JSON.net - поле либо строка, либо список & lt; string & gt;

Если вы хотите использовать 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 результат должен быть одинаковым.

Решение Вопроса

пытаться

  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 а такжеВот.

ки:

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

если переменная JSON содержит простую строку, используйте:

string[] contacts = serializer.Deserialize<MyJob>(theAboveJsonString).contacts.Split(',');
 leora13 апр. 2012 г., 16:03
Мэтт - я думаю, что вы упускаете суть вопроса. , проблема в том, что поле может быть любого типа данных. , весь вопрос в том, как я справляюсь с этой ситуацией
 leora13 апр. 2012 г., 15:34
что касается вопроса, это может быть строка или массив. ,
 13 апр. 2012 г., 16:09
Сожалею. Лучший способ справиться с этим - последовательно вводить его в базу данных. Если вы не можете это сделать, то сначала проверьте, является ли он массивом, если он не является массивом, тогда используйте string.Split (","). Чтобы проверить массив, используйте contacts.GetType (). IsArray;
 13 апр. 2012 г., 15:48
Если поле содержит строку, тогда используйте contacts.Split (',' ', чтобы преобразовать ее в массив). В любом случае вам нужно назначить его в строковом массиве, а не в простой строковой переменной.

Ваш ответ на вопрос