【问题标题】:deserialize POCO array with JsonFX使用 JsonFX 反序列化 POCO 数组
【发布时间】:2012-04-07 18:30:15
【问题描述】:

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

这是从 URL 获取的 JSON 数据示例:

[
{
"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分钟。谷歌搜索无济于事。任何帮助将不胜感激!

【问题讨论】:

    标签: c# json poco


    【解决方案1】:

    我从未使用过 JsonFX,但您可以尝试使用 Json.Net 或内置的 JavaScriptSerializer。两者都可以正常工作。

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

    【讨论】:

    • 我最终使用了 JavaScirptSerializer,它就像一个魅力。我在这里尝试了其他几个建议,但 JsonFX 没有与其中任何一个一起使用。谢谢!
    【解决方案2】:

    edit 哎呀,没看标题。你为什么使用 jsonfx? 也许尝试一个列表?

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

    这是一个如何使用 JSON.Net 完成的有效示例。

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

    使用 Nuget

    &gt; Install-Package Newtonsoft.Json

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

    【讨论】:

      【解决方案3】:

      我敢打赌,您需要在自定义类型上指定 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; }
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          相关资源
          最近更新 更多