簡體   English   中英

使用newtonsoft用數組反序列化json

[英]Deserialize json with arrays with newtonsoft

我正在嘗試使用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])反序列化為類型'System.Collections.Generic.Dictionary`2 [System.String,xMarksThePub.Model.OpeningHours]',因為該類型需要JSON對象(例如{“ name”:“ value”})正確反序列化。 要解決此錯誤,可以將JSON更改為JSON對象(例如{“ name”:“ value”}),也可以將反序列化類型更改為數組,或者將實現集合接口的類型(例如ICollection,IList)更改為List,例如List從JSON數組反序列化。 還可以將JsonArrayAttribute添加到類型中,以強制其從JSON數組反序列化。 路徑“ openingHours”,第1行,位置137。

Pub是我班的名字。

我不知道我在做什么錯。

你的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
}]

}

可以在我的機器上正常工作。 Windows 10上的C#/。Net v4.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; }
      }

    }

  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM