Ye Htut Ответов: 1

Datacontractjsonserializer - десериализация datetime


В настоящее время у меня есть строка json, в которой формат даты выглядит следующим образом: "2012-03-01T08: 00:00". всякий раз, когда вы пытаетесь десериализоваться, он показывает "не начинается с '/Date(' и заканчивается ')/"

Что я уже пробовал:

public static T JsonDeserialize<T>(string jsonString)
    {
        //Convert "yyyy-MM-dd HH:mm:ss" String as "\/Date(1319266795390+0800)\/"
        string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";

    MatchEvaluator matchEvaluator = new MatchEvaluator(
            ConvertDateStringToJsonDate);
        Regex reg = new Regex(p);
        jsonString = reg.Replace(jsonString, matchEvaluator);
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        T obj = (T)ser.ReadObject(ms);
        return obj;
    }

1 Ответов

Рейтинг:
2

Graeme_Grant

Приведенный выше код выглядит слишком сложным. Работа с JSON не должна быть такой уж сложной.

Чтобы декодировать дату, я предполагаю, что ваша информация выше, что ваши необработанные данные JSON выглядят примерно так:

{ "birthday":"2012-03-01T08:00:00" }

Это известный формат для DataContractJsonSerializer Для декодирования вы бы использовали что-то вроде этого класса:
[DataContract]
public class Example
{
    [DataMember(Name="birthday")]
    public DateTime Birthday { get; set; }
}

Вышеприведенный класс был сгенерирован с помощью JsonUtils[^] веб-сайт с вышеуказанными данными JSON.

Чтобы увидеть это в действии, я бы использовал это Класс Помощи[^]. Он использует Json.Net[^]:
using Newtonsoft.Json;
using System.Collections.Generic;

namespace Support.CSharp
{
    public static class JsonHelper
    {
        public static string FromClass<T>(T data, bool isEmptyToNull = false,
                                          JsonSerializerSettings jsonSettings = null)
        {
            string response = string.Empty;

            if (!EqualityComparer<T>.Default.Equals(data, default(T)))
                response = JsonConvert.SerializeObject(data, jsonSettings);

            return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
        }

        public static T ToClass<T>(string data,
                                   JsonSerializerSettings jsonSettings = null)
        {
            var response = default(T);

            if (!string.IsNullOrEmpty(data))
                response = jsonSettings == null
                    ? JsonConvert.DeserializeObject<T>(data)
                    : JsonConvert.DeserializeObject<T>(data, jsonSettings);

            return response;
        }
    }
}

И использовать:
var rawJson = "{ \"birthday\":\"2012-03-01T08:00:00\" }";
var result = JsonHelper.ToClass<Example>(rawJson);

То Работа с JSON в C# и VB[^] статья содержит гораздо больше деталей (с загружаемым полностью рабочим кодом) для работы с JSON, которые вы должны найти полезными. :)