2015-06-12 2 views
1

Я десериализации JSON StringDeserialize строку JSON с помощью Newtonsoft.JSON

{\"entityType\":\"Phone\",\"countValue\":30,\"lastUpdateDate\":\"3/25/14 12:00:00 PM MST\",\"RowCnt\":30}. 

Но я получаю

JSONReaderException "Could not convert string to DateTime: 3/25/14 12:00:00 PM MST". 

Примечание: Мы используем Newtonsoft.JSON для сериализации/десериализации.

+0

возможно дубликат [JSON DateTime с анализом из Newtonsoft в формате JSON Serializer] (http://stackoverflow.com/questions/668488/parsing-json- datetime-from-newtonsofts-json-serializer) –

+0

На самом деле это похоже ближе: http://stackoverflow.com/questions/21256132/deserializing-dates-with-dd-mm-yyyy-format-using-json-net – dbc

+0

Здесь моя строка - 3/25/14 12:00:00 PM MST. Это не стандартизация сериализации. У нас есть строка MST в дате времени – karthikeyan

ответ

1

Это на самом деле немного сложнее, чем предлагаемые дубликаты. Here's a related question, который имеет дело с синтаксическими строками, содержащими сокращения времени.

Чтобы использовать эту информацию в том, что ответ с Json.NET, вы могли бы быть лучше с помощью настраиваемого преобразователя:

public class DateTimeWithTimezoneConverter : JsonConverter 
{ 
    public override object ReadJson(
     JsonReader reader, 
     Type objectType, 
     object existingValue, 
     JsonSerializer serializer) 
    { 
     string t = serializer.Deserialize<string>(reader); 

     t = t.Replace("MST", "-07:00"); 
     // Do other replacements that you need here. 

     return 
      DateTime.ParseExact(t, @"M/dd/yy h:mm:ss tt zzz", CultureInfo.CurrentCulture); 
    } 

    public override void WriteJson(
     JsonWriter writer, 
     object value, 
     JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    }  


    public override bool CanConvert(Type t) 
    { 
     return typeof(DateTime).IsAssignableFrom(t); 
    } 
} 

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

Вот пример того, как вы будете использовать его:

public class MyType 
{ 
    public string EntityType { get; set; } 
    public int CountValue { get; set; } 
    public DateTime LastUpdateDate { get; set; } 
    public int RowCnt { get; set; } 
} 

string json = "{\"entityType\":\"Phone\",\"countValue\":30,\"lastUpdateDate\":\"3/25/14 12:00:00 PM MST\",\"RowCnt\":30}"; 

MyType obj = JsonConvert.DeserializeObject<MyType>(
    json, 
    new DateTimeWithTimezoneConverter());