0

JSONを逆シリアル化する最良の方法は何ですか?

次のJSONがあります

"_created" : { 
                "$dt": "2013-03-26T16:45:20Z" 
             }

そして、私はこのようにオブジェクトのフィールドを取得したい -DataTime Created {get; set;}

json.net http://james.newtonking.com/projects/json-net.aspx専門家への質問

4

4 に答える 4

1

最も簡単な方法は JsonConvertor を作成することです

public class MongoDbDateTimeConverter : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var jObject = JObject.Load(reader);

            return jObject["$dt"].Value<DateTime>();
        }

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

そしてプロパティでそれを使用しました

[JsonConverter(typeof(MongoDbDateTimeConverter))]
public DateTime Created { get; set; }
于 2013-03-28T08:57:32.127 に答える
0

使用している場合json.NET

次のようなserializeフィールドdatetimeまたはobjectからなるフィールドを試してください。datetime

JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
            };
string serializedObject= Newtonsoft.Json
                     .JsonConvert
                     .SerializeObject(data, microsoftDateFormatSettings);

JSON.NET:)を使用してシリアル化が行われている場合、問題なく動作します。

その後、正常に逆シリアル化できます

var myobject = Newtonsoft.Json.JsonConvert.DeserializeObject(serializedObject);
于 2013-03-27T10:03:38.467 に答える
0

NewtonSoftの JSON シリアライザー/デシリアライザーを使用できますが、問題なく動作しました。

ナゲットパッケージ

MediaTypeFormatter の例

次の MediaTypeFormatter を GlobalConfiguration に次のように追加します。

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonFormatter());

MediaTypeFormatter:

public class JsonFormatter : MediaTypeFormatter
{
    private const string WesternEuropeStandardTime = "W. Europe Standard Time";
    private TimeZoneInfo timeZoneInfo;

    public JsonFormatter()
    {
        SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
        this.timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(WesternEuropeStandardTime);
    }

    public override bool CanReadType(Type type)
    {
        return true;
    }

    public override bool CanWriteType(Type type)
    {
        return true;
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
    {
        Task<object> task = Task<object>.Factory.StartNew(() =>
        {
            JsonSerializerSettings settings = new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore,
            };

            StreamReader sr = new StreamReader(readStream);
            JsonTextReader jreader = new JsonTextReader(sr);

            JsonSerializer ser = new JsonSerializer();
            ser.Converters.Add(new DateTimeConverter(this.timeZoneInfo) { DateTimeFormat = "o" });

            return ser.Deserialize(jreader, type);
        });

        return task;
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext)
    {
        Task task = Task.Factory.StartNew(() =>
        {
            JsonSerializerSettings settings = new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore,
            };

            string json = JsonConvert.SerializeObject(
                value, 
                Formatting.Indented,
                new JsonConverter[1] { new DateTimeConverter(this.timeZoneInfo) { DateTimeFormat = "o" } });

            byte[] buf = System.Text.Encoding.Default.GetBytes(json);
            writeStream.Write(buf, 0, buf.Length);
            writeStream.Flush();
        });

        return task;
    }

    private class DateTimeConverter : IsoDateTimeConverter
    {
        private TimeZoneInfo timeZoneInfo;

        public DateTimeConverter(TimeZoneInfo timeZoneInfo)
        {
            this.timeZoneInfo = timeZoneInfo;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            DateTime? date = value as DateTime?;
            if (date.HasValue && DateTime.MinValue != date.Value && DateTime.MaxValue != date.Value)
            {
                TimeSpan timeZoneOffset = this.timeZoneInfo.GetUtcOffset(date.Value);
                value = DateTime.SpecifyKind(date.Value - timeZoneOffset, DateTimeKind.Utc);
            }

            base.WriteJson(writer, value, serializer);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            object result = base.ReadJson(reader, objectType, existingValue, serializer);

            DateTime? date = result as DateTime?;
            if (date.HasValue && DateTime.MinValue != date.Value && DateTime.MaxValue != date.Value)
            {
                TimeSpan timeZoneOffset = this.timeZoneInfo.GetUtcOffset(date.Value);
                result = DateTime.SpecifyKind(date.Value + timeZoneOffset, DateTimeKind.Utc);
            }

            return result;
        }
    }
}
于 2013-03-27T09:43:15.687 に答える
-1

C# の JSON パーサーについて質問している場合、それはむしろ Google のものです。そこを探してください。利用可能なものがたくさんあります。

この文字列を DateTime に解析する方法について質問している場合は、それDateTime.TryParse()が役に立ちます。のような提供された文字列形式でそれを助けることができますyyyy-MM-ddTHH:mm:ss

于 2013-03-27T09:34:26.887 に答える