使用JsonFX反序列化POCO数组

时间:2012-04-07 18:30:15

标签: c# json poco

我想简单地从URL中读取一些JSON数据,然后将其转换为POCO类的集合,但我似乎无法弄清楚我做错了什么。

以下是JSON数据的示例,因为它是从URL中提取的:

[
{
"Name":"Together As One Run",
"Location":"Parkville, MO",
"ScheduledAt":"\/Date(1334984400000)\/",
"URL":"http://www.runningintheusa.com/Race/View.aspx?RaceID=36667"
},
{
"Name":"Lean Green Running Machine 5K Run/Walk and 1 Mile Run",
"Location":"Springfield, MO",
"ScheduledAt":"\/Date(1335589200000)\/",
"URL":"http://www.runningintheusa.com/Race/View.aspx?RaceID=53945"
},
{
"Name":"Festival of Miles",
"Location":"St. Louis, MO",
"ScheduledAt":"\/Date(1338440400000)\/",
"URL":"http://www.runningintheusa.com/Race/View.aspx?RaceID=53901"
},
{
"Name":"Miles Against Melanoma",
"Location":"Saint Charles, MO",
"ScheduledAt":"\/Date(1338613200000)\/",
"URL":"http://www.runningintheusa.com/Race/View.aspx?RaceID=53939"
}
]

我可以很好地使用WebClient获取这些数据。

我正在设置我的JsonFX阅读器:

var json = new JsonReader(new DataReaderSettings(new PocoResolverStrategy()));

这是我的POCO课程:

public class Race {
  public String Name { get; set; }
  public String Location { get; set; }
  public DateTime ScheduledAt { get; set; }
  public String URL { get; set; }
}

我试图以多种方式反序列化JSON数据,似乎没有任何工作:

//reader is an instance of StreamReader
var content = reader.ReadToEnd();
//nope
//var output = json.Read<Race>(content);
//nope
//var output = json.Read<Race[]>(content);

这必须是一件简单的事情,我找不到解决方案。我花了大约30分钟。谷歌搜索无济于事。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

我从未使用过JsonFX,但您可以尝试Json.Net或内置JavaScriptSerializer。两者都没有任何问题。

 var jObj1 = JsonConvert.DeserializeObject<Race[]>(jsonstr);
 var jobj2 = new JavaScriptSerializer().Deserialize<Race[]>(jsonstr);

答案 1 :(得分:0)

编辑 oops,没看过标题。你为什么用jsonfx? 也许试试一个清单?

var output = json.Read<List<Race>>(input);

以下是如何使用JSON.Net完成任务的有效示例。

您将要使用JSON.NET。它比任何内置类都快,并且在序列化字典方面做得更好。

使用Nuget

> Install-Package Newtonsoft.Json

List<Race> deserializedRaces = JsonConvert.DeserializeObject<List<Race>>(jsonString);

答案 2 :(得分:0)

我敢打赌你需要在自定义类型上指定datacontract和datamember属性,以便jsonFX识别它。

using System.Runtime.Serialization;
[DataContract]
public class Race {
  [DataMember]
  public String Name { get; set; }
  [DataMember]
  public String Location { get; set; }
  [DataMember]
  public DateTime ScheduledAt { get; set; }
  [DataMember]
  public String URL { get; set; }
}

答案 3 :(得分:0)

您可能需要告诉它尝试将您的日期解析为Microsoft风格的日期时间:

var jsonReader = new JsonReader(
    new DataReaderSettings(
        new PocoResolverStrategy(),
        new MSAjaxDateFilter()));