Я получаю следующий json формат строки из API:
{
"Items":[
{
"Item":{
"Codes":{},
"Date":1523539700000,
"Name":"Item1",
"Price":"15"
}
},
{
"Item":{
"Codes":{
"productcode":"a",
"departmentcode":"b",
"storecode":"c"
},
"Date":1523537700000,
"Name":"Item2",
"Price":"20"
}
},
{
"Item":{
"Codes":{
"productcode":"a",
"departmentcode":"b",
"storecode":"c"
},
"date":1523539700000,
"name":"Item3",
"price":"30"
}
}
]
}
Я не заинтересован в элементе Codes, а затем создал следующий класс:
public class Item
{
[JsonConverter(typeof(ConvertItemDateTime))]
[JsonProperty(PropertyName = "dateReceived")]
public DateTime DateReceived { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name{ get; set; }
[JsonProperty(PropertyName = "price")]
public double Price{ get; set; }
public IList<Items> itemListResults { get; set; } //For view
public int productid; // Added for view
}
I затем попробуйте разобрать его ...
JObject jsondata = JObject.Parse(responseToString(response))
var values = json.GetValue("Items");
... который к этому моменту я вижу, что переменная 'values' по-прежнему содержит каждое значение (Date, Name, Price) внутри каждого элемента. Затем я пытаюсь десериализовать его ...
IList<Items> itemList = new List<Items>();
itemList = JsonConvert.DeserializeObject<IList<Items>>(values.ToString());
Когда я отлаживаю с этого момента, я вижу список с точным количеством ожидаемых предметов, но со всеми значениями (Дата, Имя, Цена) являются нулевыми Значение Date внутри json изменится (со стороны API). Иногда это будет длинный, а иногда строковый формат даты, содержащий «[GMT]».
Мой метод ConvertItemDateTime выглядит следующим образом:
public class ConvertItemDateTime : JsonConverter
{
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public override bool CanConvert(Type objectType)
{
Console.WriteLine(objectType);
return true;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Console.WriteLine(value.GetType());
long ticks;
if (value is DateTime)
{
var dateTime = (DateTime)value;
ticks = (long)(dateTime.ToUniversalTime() - UnixEpoch).TotalMilliseconds;
}
else if (value is DateTimeOffset)
{
var dateTimeOffset = (DateTimeOffset)value;
ticks = (long)(dateTimeOffset.ToUniversalTime() - UnixEpoch).TotalMilliseconds;
}
else
{
throw new JsonSerializationException("Expected date object value.");
}
if (ticks < 0)
{
throw new JsonSerializationException("Cannot convert date value that is before Unix epoch of 00:00:00 UTC on 1 January 1970.");
}
writer.WriteValue(ticks);
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
long ticks;
if (reader.TokenType == JsonToken.Integer)
{
ticks = (long)reader.Value;
}
else if (reader.TokenType == JsonToken.String)
{
var stringValue = reader.Value.ToString();
if (stringValue.Contains("[GMT]"))
{
stringValue = stringValue.Substring(0, stringValue.Length - 6);
DateTime createdDate = DateTime.Parse(stringValue);
return createdDate;
}
if (!long.TryParse((string)reader.Value, out ticks))
{
throw new JsonSerializationException("Cannot convert invalid value.");
}
}
else
{
throw new JsonSerializationException("Unexpected token parsing date.");
}
if (ticks >= 0)
{
DateTime d = UnixEpoch.AddMilliseconds(ticks);
Type t = objectType;
if (t == typeof(DateTimeOffset))
{
return new DateTimeOffset(d, TimeSpan.Zero);
}
return d;
}
else
{
throw new JsonSerializationException("Cannot convert value that is before Unix epoch of 00:00:00 UTC on 1 January 1970.");
}
}
}
}
Пожалуйста, помогите мне заставить это работать.