c# - JSON 不反序列化

标签 c# json wcf serialization deserialization

这是我第一次尝试 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\":\"Please pray for my dog Rusty. He has cancer :(\",\"prayerCategory\":\"General\",\"prayerDate\":\"2017-06-10T21:24:16.1\",\"handle\":\"GuruJee\",\"country\":\"USA\"},{\"prayerid\":1,\"prayer\":\"Help Me I need a appendectomy STAT\",\"prayerCategory\":\"Sports\",\"prayerDate\":\"2017-04-10T20:30:39.77\",\"handle\":\"GuruJee\",\"country\":\"USA\"}]"}

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

 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 作为唯一的类项。完全忽略我的整个结构。

最佳答案

您没有提供 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\":\"Please pray for my dog Rusty. He has cancer\",\"prayerid\":\"2\",\"prayerCategory\":\"General\",\"prayerCategoryID\":null,\"prayerDate\":\"2017-06-10T21:24:16.1\",\"handle\":\"GuruJee\",\"country\":\"USA\"},{\"prayer\":\"Help Me I need a appendectomy STAT\",\"prayerid\":\"1\",\"prayerCategory\":\"Sports\",\"prayerCategoryID\":null,\"prayerDate\":\"2017-04-10T20:30:39.77\",\"handle\":\"GuruJee\",\"country\":\"USA\"}]}"

反序列化看起来像

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

关于c# - JSON 不反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480635/

相关文章:

c# - 从网络共享运行 C#.net winForms 的性能考虑

c# - 在不移动光标的情况下执行鼠标单击

c# - 如何获得已经发布的 SAML 断言?

javascript - 计算 JSON 中的键/值

c# - 如何动态更改上传文件夹

javascript - 从 json 文件 javascript 中删除空值

.net - IIS 7 上的 net.tcp WCF 服务(mex 终结点)出现 "There is no compatible TransportManager found"错误

c# - 从 WCF 架构验证器中抛出自定义响应

c# - 自动完成扩展程序未填充

javascript - 如何将此 json 与 Angular 数据表一起使用