2015-01-23 3 views
0
[DataContract] 
[KnownType(typeof(List<string>))] 
[KnownType(typeof(string))] 
public class User 
{ 
    public object websites { get; set; } 
} 

Веб-сайты могут быть массивом строк или одной строки. Если он действительно проходит через массив строк ... Он автоматически объединяется в строку, разделенную запятой. Как я могу это предотвратить? Мне нужно, чтобы это было СписокDataMember, связанный с разделителем, разделенным запятой

Когда я пытаюсь строка [], это, кажется, не в состоянии на это:

массива:

{ 
    websites: [ "http://www.google.com", "http://www.whatever.com" ] 
}  

Одиночная строка

{ 
    websites: "http://www.google.com"  
} 
+0

Если он должен быть список, почему вы ввели его как 'dynamic'? Откуда берутся данные? Кто десериализирует его и от чего? –

+0

Он исходит из API ... Он в формате JSON ... Я понятия не имею, что такое динамическое средство, за исключением того, что он не сбой :) Он варьируется от List и строки, поэтому он не может быть явно определен. – Jimmyt1988

+2

Сделайте это массивом строк и обработайте его как массив строк. – Will

ответ

1

Я не уверен, что вам нужно иметь эти атрибуты на User. Если нет, то этот код работает отлично:

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var jsonOne = "{ websites: \"http://www.google.com\" }"; 
     var jsonMany = "{ websites: [ \"http://www.google.com\", \"http://www.whatever.com\" ] }"; 

     var userOne = JsonConvert.DeserializeObject<User>(jsonOne); 
     var userMany = JsonConvert.DeserializeObject<User>(jsonMany); 

     Debug.WriteLine(":: One ::"); 
     Print(userOne); 

     Debug.WriteLine(":: Many ::"); 
     Print(userMany); 
    } 

    static void Print(User user) 
    { 
     if(user.websites is string) 
     { 
      Debug.WriteLine("This user has a single website: {0}", user.websites); 
     } 

     if (user.websites is JArray) 
     { 
      Debug.WriteLine("This user has following websites:"); 
      foreach (var website in (JArray)user.websites) 
       Debug.WriteLine(website); 
     } 
    } 
} 

public class User 
{ 
    public object websites { get; set; } 
} 

Выход:

:: One :: 
This user has a single website: http://www.google.com 
:: Many :: 
This user has following websites: 
http://www.google.com 
http://www.whatever.com 
+0

К сожалению, моя модель используется повсюду, есть ли другой способ с Microsoft System.Runtime.Serialization? – Jimmyt1988

+0

Можете ли вы предоставить код, который вы используете для десериализации? – Tonci

+1

Tonci, я подумал про себя, жизнь слишком коротка ... Я закончил тем, что все обменялся на newtonsoft ... это заняло некоторое время, но спасило бы меня от боли. Спасибо за помощь человек: D – Jimmyt1988

Смежные вопросы