【问题标题】:JSON Not DeserializingJSON 不反序列化
【发布时间】:2017-06-11 05:21:20
【问题描述】:

这是我第一次尝试 WCF/JSON。我创建了一个 WCF Web 服务。这是我的方法之一。这就是我将数据序列化为 JSON 的方式。

   public string GetPrayers()
    {
        DataTable myDt = new DataTable();
        myDt = sprocToDT("LoadPrayers");
        string JSONString = string.Empty;
        JSONString = JsonConvert.SerializeObject(myDt, Formatting.None);
        return JSONString;
    }

这会返回一个不错的 JSON 数据集:

{"GetPrayersResult":"[{\"prayerid\":2,\"prayer\":\"请为我祈祷 狗生锈。他得了癌症 :(\",\"prayerCategory\":\"General\",\"prayerDate\":\"2017-06-10T21:24:16.1\",\"句柄\":\"GuruJee\",\ "country\":\"USA\"},{\"prayerid\":1,\"prayer\":\"帮助 我需要阑尾切除术 STAT\",\"prayerCategory\":\"Sports\",\"prayerDate\":\"2017-04-10T20:30:39.77\",\"handle\":\"GuruJee\",\"国家\":\"美国\"}]"}

当我去反序列化它时,我得到所有空值。这是我创建的类:

 public class PrayUpPrayers
        {
            public string prayer { get; set; }
            public string prayerid { get; set; }
            public string prayerCategory { get; set; }
            public string prayerCategoryID { get; set; }
            public string prayerDate { get; set; }
            public string handle { get; set; }
            public string country { get; set; }  
        }

        public class ThePrayer
        {
        public PrayUpPrayers prayers { get; set; }
        }


    }

这就是我检索 JSON 的方式:

void getData()
        {
            var request = HttpWebRequest.Create(string.Format(@"URLGoesHere"));
            request.ContentType = "application/json";
            request.Method = "GET";

            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                if (response.StatusCode != HttpStatusCode.OK)
                    Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    var content = reader.ReadToEnd();
                    string foo = content.ToString();

                    var testing = JsonConvert.DeserializeObject<prayupapp.ModelClasses.PrayUpPrayers>(foo,
               new JsonSerializerSettings
               {
                   NullValueHandling = NullValueHandling.Ignore
               });

测试总是空的?我序列化它的问题是错误的,可能是类结构,还是与我如何反序列化它有关。一个重要说明:我在其中一个 JSONClassesFromC# 站点上检查了我的 JSON,它只返回 GetPrayersResult 作为唯一的类项。完全忽略了我的整个结构。

【问题讨论】:

  • 我想你差不多了,只是你需要反序列化 JSON 数组。例如 var a = serializer.Deserialize&lt;List&lt;prayupapp.ModelClasses.PrayUpPrayers&gt;&gt;(foo)
  • 马上试试!
  • @turbot 什么是序列化程序。
  • 当我使用这个时:var a = serializer.Deserialize&lt;List&lt;prayupapp.ModelClasses.PrayUpPrayers&gt;&gt;(foo); 我得到:序列化程序在这个上下文中不存在
  • 抱歉,你应该使用JsonConvert.DeserializeObjectList&lt;prayupapp.ModelClasses.PrayUpPra‌​yers&gt;&gt;(foo)

标签: c# json wcf serialization deserialization


【解决方案1】:

您没有提供sprocToDT 的代码,但它应该创建ThePrayer 对象,该对象应该包含PrayUpPrayers 的列表

public class ThePrayer
{
    public List<PrayUpPrayers> prayers { get; set; }
}

然后你应该反序列化 ThePrayer 对象,而不是 PrayUpPrayers

例如

PrayUpPrayers prayUpPrayers1 = new PrayUpPrayers
{
    prayer = "Please pray for my dog Rusty. He has cancer",
    prayerid = "2",
    prayerCategory = "General",
    prayerDate = "2017-06-10T21:24:16.1",
    handle = "GuruJee",
    country = "USA"
};

PrayUpPrayers prayUpPrayers2 = new PrayUpPrayers
{
    prayer = "Help Me I need a appendectomy STAT",
    prayerid = "1",
    prayerCategory = "Sports",
    prayerDate = "2017-04-10T20:30:39.77",
    handle = "GuruJee",
    country = "USA"
};

ThePrayer thePrayer = new ThePrayer
{
    prayers = new List<PrayUpPrayers>
    {
        prayUpPrayers1, prayUpPrayers2
    }
};

您的代码中的myDt 应该与我的代码中的thePrayer 实例相同。

JSONString = JsonConvert.SerializeObject(myDt, Formatting.None);

将提供看起来像的 Json

"{\"prayers\":[{\"prayer\":\"请为我的狗Rusty祈祷。他有 cancer\",\"prayerid\":\"2\",\"prayerCategory\":\"General\",\"prayerCategoryID\":null,\"prayerDate\":\"2017-06-10T21: 24:16.1\",\"句柄\":\"GuruJee\",\"国家\":\"美国\"},{\"祈祷\":\"帮助 我需要阑尾切除术 STAT\",\"prayerid\":\"1\",\"prayerCategory\":\"Sports\",\"prayerCategoryID\":null,\"prayerDate\":\"2017-04-10T20: 30:39.77\",\"句柄\":\"GuruJee\",\"国家\":\"美国\"}]}"

反序列化看起来像

var testing = JsonConvert.DeserializeObject<prayupapp.ModelClasses.ThePrayer>(foo,
    new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore
    });

【讨论】:

  • 我现在可能真的很接近了。我按照您推荐的方式正确地重新构建了我的模型,它进行了序列化,但出现了问题。在 SO 中是否可以使用更正的代码更新问题。我仍然得到一个空反序列化。
  • @logixologist 将Edit 部分添加到您的问题中,并将您当前的代码和问题放在那里。
【解决方案2】:

这很简单。你应该对输出进行两次反序列化。试试这个:

var output= DeserializeObject<string>(foo);

var testing = JsonConvert.DeserializeObject<prayupapp.ModelClasses.PrayUpPrayers>(output,
               new JsonSerializerSettings
               {
                   NullValueHandling = NullValueHandling.Ignore
               });

【讨论】:

  • 嗯,这是个好主意。不幸的是,它不会第一次解析 JSON。但我的 json 已经通过验证器运行,它是有效的 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多