使用newtonsoft用数组反序列化json

时间:2018-11-06 00:39:45

标签: c# json json.net

我正在尝试使用C#中的newtosoft json反序列化以下json对象:

{
  "address": "address",
  "id": 1,
  "latitude": 46.0757062,
  "longitude": 18.1975697,
  "name": "store name",
  "openingHours": [
    {
      "closeing": "01:00:00",
      "opening": "11:00:00",
      "weekday": 1
    }
  ]
}

我的课看起来像这样:

    [PrimaryKey, JsonProperty("id")]
    public int Id { get; }

    [JsonProperty("name"), Column("name")]
    public string Name { get; }

    [JsonProperty("latitude"), Column("latitude")]
    public double Latitude { get; }

    [JsonProperty("longitude"), Column("longitude")]
    public double Longitude { get; }

    [JsonProperty("openingHours"), Ignore]
    public List<OpeningHours> Openinghours { get; set; }

OpeningHours类:

public class OpeningHours
{
    [JsonProperty("weekday")]
    public int Day { get; set; }

    [JsonProperty("opening")]
    public TimeSpan Open { get; set; }

    [JsonProperty("closeing")]
    public TimeSpan Close { get; set; }
}

这是尝试反序列化的方式:

var result = JsonConvert.DeserializeObject<T>(json); //<-- this one should be the correct
var result = JsonConvert.DeserializeObject<T[]>(json);
var result = JsonConvert.DeserializeObject<List<T>>(json);

每次我遇到这样的错误:

  

Newtonsoft.Json.JsonSerializationException:无法反序列化   当前JSON数组(例如[1,2,3])转换为type   'System.Collections.Generic.Dictionary`2 [System.String,xMarksThePub.Model.OpeningHours]'   因为该类型需要一个JSON对象(例如{“ name”:“ value”})   正确反序列化。要解决此错误,请将JSON更改为   JSON对象(例如{“ name”:“ value”})或将反序列化类型更改为   实现集合接口的数组或类型(例如   ICollection,IList),例如可以从JSON反序列化的List   数组。还可以将JsonArrayAttribute添加到类型中以强制将其   从JSON数组反序列化。路径“ openingHours”,第1行,位置   137。

Pub是我班的名字。

我不知道我在做什么错。

2 个答案:

答案 0 :(得分:0)

您的JSON不正确,因为其中包含多余的,。试试这个:

{
"address": "address",
"id": 1,
"latitude": 46.0757062,
"longitude": 18.1975697,
"name": "store name",
"openingHours": [{
    "closeing": "01:00:00",
    "opening": "11:00:00",
    "weekday": 1
}]

}

答案 1 :(得分:0)

可以在我的机器上正常运行。 Windows 10上为C#/。Netv4.7.1。Newtonsoft.Json为v11.0.2。

关于我唯一要做的更改是使类的属性为get / set,而不仅仅是get。否则,反序列化器在重新补充水分时无法为其分配值。

using System;
using System.Collections.Generic;

using Newtonsoft.Json;

namespace ConsoleApp6
{
  class Program
  {
    const string json = @"
{
  ""address"": ""address"",
  ""id"": 1,
  ""latitude"": 46.0757062,
  ""longitude"": 18.1975697,
  ""name"": ""store name"",
  ""openingHours"":
    [
        { ""closeing"": ""01:00:00"", ""opening"": ""11:00:00"", ""weekday"": 1 }
    ]
}
";

    static void Main( string[] args )
    {
      Pub rehydrated;
      try
      {
        rehydrated = JsonConvert.DeserializeObject<Pub>( json );
      }
      catch ( Exception e )
      {
        Console.WriteLine( e.ToString() );
      }

      return;
    }

    public class Pub
    {
      [JsonProperty( "id" )]
      public int Id { get; set; }

      [JsonProperty( "name" )]
      public string Name { get; set; }

      [JsonProperty( "latitude" )]
      public double Latitude { get; set; }

      [JsonProperty( "longitude" )]
      public double Longitude { get; set; }

      [JsonProperty( "openingHours" )]
      public List<OpeningHours> Openinghours { get; set; }

      public class OpeningHours
      {
        [JsonProperty( "weekday" )]
        public int Day { get; set; }

        [JsonProperty( "opening" )]
        public TimeSpan Open { get; set; }

        [JsonProperty( "closeing" )]
        public TimeSpan Close { get; set; }
      }

    }

  }
}