Json.net无法将JSON字符串反序列化为ObservableCollection

时间:2013-09-20 09:43:38

标签: json.net deserialization observablecollection

我正在尝试将JSON字符串反序列化为ObservableCollection对象,但Json.net正在抛出此错误

  

{“无法将当前JSON对象(例如{\”name \“:\”value \“})反序列化为类型'System.Collections.ObjectModel.ObservableCollection`1 [ZenPanda.DataModel.Session]',因为类型需要一个JSON数组(例如[1,2,3])才能正确反序列化。\ r \ n要修复此错误要么将JSON更改为JSON数组(例如[1,2,3]),要么更改反序列化类型以便它是一个普通的.NET类型(例如,不是像整数这样的基本类型,不是类似于数组或List的集合类型),可以从JSON对象反序列化.JsonObjectAttribute也可以添加到类型中以强制它从一个类型反序列化JSON对象。\ r \ n“'参数',第1行,第13位。”}


我的Datamodel位于

之下
public class Session
{
    [JsonProperty("arguments")]
    public SessionProperties arguments { get; set; }

    [JsonProperty("result")]
    public string Result { get; set; }

    [JsonProperty("tag")]
    public int Tag { get; set; }
}

public class SessionProperties
{
   [JsonProperty("alt-speed-down")]
   public int Altspeeddown { get; set; }

   [JsonProperty("alt-speed-enabled")]
   public bool Altspeedenabled { get; set; }

   [JsonProperty("alt-speed-time-begin")]
   public int Altspeedtimebegin { get; set; }

   [JsonProperty("alt-speed-time-day")]
   public int Altspeedtimeday { get; set; }

   [JsonProperty("alt-speed-time-enabled")]
   public bool Altspeedtimeenabled { get; set; }

   [JsonProperty("units")]
   public SessionUnits Units { get; set; }

   [JsonProperty("utp-enabled")]
   public bool Utpenabled { get; set; }
}

public class SessionUnits
{
    [JsonProperty("memory-bytes")]
    public int Memorybytes { get; set; }

    [JsonProperty("memory-units")]
    public List<string> Memoryunits { get; set; }
}

这是调用JsonConvert的代码

 public ObservableCollection<Session> currentSession = new ObservableCollection<Session>();

 string sessionResponse = await task.Content.ReadAsStringAsync();

 currentSession = JsonConvert.DeserializeObject<ObservableCollection<Session>>(sessionResponse);

这是原始JSON

{"arguments": {"alt-speed-down":50,"alt-speed-enabled":false,"alt-speed-time-begin":540,"alt-speed-time-day":127,"alt-speed-time-enabled":false,
    "units":{"memory-bytes":1024,"memory-units":["KiB","MiB","GiB","TiB"],"size-bytes":1000,"size-units":["kB","MB","GB","TB"],"speed-          bytes":1000,"speed-units":["kB/s","MB/s","GB/s","TB/s"]},
    "utp-enabled":true}, 
"result":"success", 
"tag":568}  

如果我将currentSession声明为普通的Session对象,那么Json.net会愉快地反序列化到该实例中,但当我将其声明为ObservableCollection时,Json.net会抛出错误。

如果这是一个完整的新手cockup问题/问题,我对编程很新,所以道歉。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的JSON仅表示单个元素,因此您必须将其反序列化为单个对象。为了直接反序列化到集合中,您的JSON需要表示一个数组。由于它没有,当您尝试执行此操作时会出现错误。

您最好的选择是将JSON反序列化为Session对象,就像您最初所做的那样,然后只需自己创建ObservableCollection并将Session添加到其中。

Session session = JsonConvert.DeserializeObject<Session>(sessionResponse);
ObservableCollection collection = new ObservableCollection<Session>();
collection.Add(session);