Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVC Newtonsoft JSON自定义JSONConverter_Json_Converter - Fatal编程技术网

MVC Newtonsoft JSON自定义JSONConverter

MVC Newtonsoft JSON自定义JSONConverter,json,converter,Json,Converter,我有一个输出JSON的web资源,如下所示: [{"returnValue": [{"facility":"DRIO","recrd_desc":"DEFAULT","update_time":{"$date":1509128545000},"control_num":1,"starttime":{"$date":1506830400000},"endtime":{"$date":4102462799000},"can_exchange_rate":2000}, {"facility":"DRI

我有一个输出JSON的web资源,如下所示:

[{"returnValue":
[{"facility":"DRIO","recrd_desc":"DEFAULT","update_time":{"$date":1509128545000},"control_num":1,"starttime":{"$date":1506830400000},"endtime":{"$date":4102462799000},"can_exchange_rate":2000},
{"facility":"DRIO","recrd_desc":"TEMP","update_time":{"$date":1521229607000},"control_num":37,"starttime":{"$date":1513040240000},"endtime":{"$date":1544576240000},"can_exchange_rate":2112},
{"facility":"DRIO","recrd_desc":"TEMP 3","update_time":{"$date":1521229399000},"control_num":38,"starttime":{"$date":1544576580000},"endtime":{"$date":1576112580000},"can_exchange_rate":2000}],
"ok":1.0}]
我将上述Json反序列化为我的模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace CSCApi.Models
{
    public class FareChartTypeResponse
    {
        public List<FareChartType> ReturnValue { get; set; }
        public decimal ok { get; set; }
    }

    public class FareChartType
    {
        public string facility { get; set; }
        public string recrd_desc { get; set; }
        public Update_Time update_time { get; set; }
        public int control_num { get; set; }
        public Starttime starttime { get; set; }
        public Endtime endtime { get; set; }
        public int can_exchange_rate { get; set; }        
    }

    public class Update_Time
    {        
        [JsonProperty(PropertyName = "$date")]
        [JsonConverter(typeof(LongToStringConverter))]
        public string date { get; set; }
    }

    public class Starttime
    {
        [JsonProperty(PropertyName = "$date")]
        [JsonConverter(typeof(LongToStringConverter))]
        public string date { get; set; }
    }

    public class Endtime
    {
        [JsonProperty(PropertyName = "$date")]
        [JsonConverter(typeof(LongToStringConverter))]
        public string date { get; set; }
    }

    public class LongToStringConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(System.Int64).Equals(objectType);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType != JsonToken.Integer)
            {
                throw new Exception(
                    String.Format("Unexpected token parsing date. Expected Integer, got {0}.",
                    reader.TokenType));
            }

            var ticks = (long)reader.Value;

            var date = new DateTime(1970, 1, 1);
            //date = date.AddSeconds(ticks).ToLocalTime();
            date = date.AddSeconds(ticks);
            //return date;
            string dateString = ((DateTime)date).ToString("yyyy-MM-dd HH:mm:ss");
            return dateString;
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            long ticks;                       
            if (value is string)
            {
                DateTime _d = Convert.ToDateTime(value);
                var epoc = new DateTime(1970, 1, 1);                
                var delta = _d - epoc;
                if (delta.TotalSeconds < 0)
                {
                    throw new ArgumentOutOfRangeException(
                        "Unix epoc starts January 1st, 1970");
                }
                ticks = (long)delta.TotalSeconds;
            }
            else
            {
                throw new Exception("Expected date object value.");
            }
            writer.WriteValue(ticks);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Converters;
名称空间CSCApi.Models
{
公共舱票价表类型响应
{
公共列表返回值{get;set;}
公共十进制确定{get;set;}
}
公共舱票价表类型
{
公共字符串工具{get;set;}
公共字符串recrd_desc{get;set;}
公共更新时间更新时间{get;set;}
公共int控件_num{get;set;}
公共开始时间开始时间{get;set;}
公共结束时间结束时间{get;set;}
公共整数可交换汇率{get;set;}
}
公共类更新时间
{        
[JsonProperty(PropertyName=“$date”)]
[JsonConverter(类型(LongToStringConverter))]
公共字符串日期{get;set;}
}
公共类开始时间
{
[JsonProperty(PropertyName=“$date”)]
[JsonConverter(类型(LongToStringConverter))]
公共字符串日期{get;set;}
}
公共类结束时间
{
[JsonProperty(PropertyName=“$date”)]
[JsonConverter(类型(LongToStringConverter))]
公共字符串日期{get;set;}
}
公共类LongToStringConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回typeof(System.Int64).Equals(objectType);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
if(reader.TokenType!=JsonToken.Integer)
{
抛出新异常(
Format(“意外的令牌解析日期。应为整数,得到{0}”,
reader.TokenType);
}
var ticks=(长)reader.Value;
var日期=新的日期时间(1970,1,1);
//date=date.AddSeconds(ticks.ToLocalTime();
日期=date.AddSeconds(刻度);
//返回日期;
字符串dateString=((DateTime)date).ToString(“yyyy-MM-dd HH:MM:ss”);
返回日期字符串;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
长蜱;
if(值为字符串)
{
DateTime _d=Convert.ToDateTime(值);
var epoc=新日期时间(1970,1,1);
var delta=_d-epoc;
如果(增量总秒数<0)
{
抛出新ArgumentOutOfRangeException(
“Unix epoc从1970年1月1日开始”);
}
ticks=(长)delta.TotalSeconds;
}
其他的
{
抛出新异常(“预期的日期对象值”);
}
writer.WriteValue(滴答声);
}
}
}
上面的自定义转换器似乎不工作。我试图做的是在读取和输出long时将$date(unix时间戳)转换为datetime字符串(以特定格式)。 如果有人能帮我,我将不胜感激

我试着用UnixDateTimeConverter装饰,但也没用

谢谢
NH

来自we资源的Unix时间戳以毫秒为单位,我将其解析为转换为时间字符串。现在很好用