Json序列化为空
本文关键字:序列化 Json | 更新日期: 2023-09-27 18:06:21
我对Json并没有太多的需求,所以它对我来说仍然是令人头疼的挫败感。如果这是骗人的,我很抱歉,但我在搜索中找到的所有东西都与不同的问题有关。
我试图使用沃尔玛API,我的数据是通过良好的(我已经附上了下面的一个记录供参考)。所有现有的问题,我能找到似乎处理null数据进来。这是关于空数据输出。
问题/问题:我对API的调用结果是一个巨大的返回-在1000的记录(385MB未压缩)。当我反序列化时,我没有得到异常,我仍然得到1000条记录,但是返回列表中的每个属性都是空或0。因此,Json返回一个泛型列表,该列表有记录,记录不为空,但每个记录中的所有值/属性都为空(如果是数字,则为0)。
我在序列化过程中设置了一个断点,我可以看到json数据正确传入。结果是null/0
如果你有任何想法,我将非常感谢你能提供的任何帮助。感谢您在百忙之中阅读本文,并提前感谢您提供的任何帮助。
不良结果:
Item_ID itemId parentItemId name salePrice upc shortDescription longDescription brandName thumbnailImage mediumImage largeImage productTrackingUrl ninetySevenCentShipping standardShipRate size color marketplace shipToStore freeShipToStore productUrl customerRating numReviews customerRatingImage rollBack bundle clearance stock gender age freeShippingOver50Dollars availableOnline
1 0 0 NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL 0 0 NULL NULL 0 0 0 NULL NULL 0 NULL 0 0 0 NULL NULL NULL 0 0
序列化逻辑:
public API_Json_Special_Feeds.RootObject testExistingJson()
{
string json = "";
//I saved a response to a text file so I don't overload the API with testing. The same problem happens whether or not I load from API or text file.
using(TextReader tr = new StreamReader(@"C:jsonsingle.txt"))
{
json = tr.ReadToEnd();//string
}
var serializer = new DataContractJsonSerializer(typeof(API_Json_Special_Feeds.RootObject));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
var data = (API_Json_Special_Feeds.RootObject)serializer.ReadObject(ms);
return data;
}
示例Json记录:
{"items":[ {
"itemId" : 12321374,
"parentItemId" : 12321374,
"name" : "Castle Tent Loft Bed w/ Slide ; Under Bed Storage, Blue",
"salePrice" : 369.0,
"upc" : "081438383996",
"shortDescription" : "Finished in White powder coat with Blue and Red Microfiber fabric tent",
"longDescription" : "Fun Castle Tent Bunk Bed with Slide includes a tent over twin bed and a covered hiding place below. The covered hiding place below can also be used as under bed storage. The top of the slide is tented with a tower with peek through, fold down window covers. <ul class="noindent"><li>Finished in White powder coat with Blue and Red Microfiber fabric tent, 100% polyester.</li><li>Uses a standard twin size mattress (sold separately).</li><li>Only use a twin size mattress that is 74-75" long and 37.5-38.5" wide.</li><li>Bunk bed is tested and certified by an independent testing laboratory to meet all minimum requirements of ASTM F1427-07 and U.S. CFR 1213 and 1513.</li><li>Some assembly required. 79-3/4" x 101-1/4" x 92" tall.</li></ul>",
"brandName" : "Castle",
"thumbnailImage" : "https://i5.walmartimages.com/asr/a1bac83b-68f2-427e-82ac-97ce1e11b0c6_1.f18ff9fc14c7aca2d9c92c81f4b5c8ba.jpeg?odnHeight=100&odnWidth=100&odnBg=ffffff",
"mediumImage" : "https://i5.walmartimages.com/asr/a1bac83b-68f2-427e-82ac-97ce1e11b0c6_1.f18ff9fc14c7aca2d9c92c81f4b5c8ba.jpeg?odnHeight=180&odnWidth=180&odnBg=ffffff",
"largeImage" : "https://i5.walmartimages.com/asr/a1bac83b-68f2-427e-82ac-97ce1e11b0c6_1.f18ff9fc14c7aca2d9c92c81f4b5c8ba.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff",
"productTrackingUrl" : "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=http%253A%252F%252Fwww.walmart.com%252Fip%252FCastle-Tent-Loft-Bed-w-Slide--Under-Bed-Storage-Blue%252F12321374%253Faffp1%253D%257Capk%257C%2526affilsrc%253Dapi",
"ninetySevenCentShipping" : false,
"standardShipRate" : 0.0,
"size" : "Twin",
"color" : "Blue",
"marketplace" : false,
"shipToStore" : true,
"freeShipToStore" : true,
"productUrl" : "http://c.affil.walmart.com/t/api00rb?l=http%3A%2F%2Fwww.walmart.com%2Fip%2FCastle-Tent-Loft-Bed-w-Slide--Under-Bed-Storage-Blue%2F12321374%3Faffp1%3D%7Capk%7C%26affilsrc%3Dapi%26veh%3Daff%26wmlspartner%3Dreadonlyapi",
"customerRating" : "4.574",
"numReviews" : 54,
"customerRatingImage" : "http://i2.walmartimages.com/i/CustRating/4_6.gif",
"rollBack" : true,
"bundle" : true,
"clearance" : false,
"stock" : "Available",
"gender" : "Boys",
"age" : "Child",
"freeShippingOver50Dollars" : true,
"availableOnline" : true
}]
}
Json类:public class API_Json_Special_Feeds
{
[DataContract]
public class Item
{
public int itemId { get; set; }
public int parentItemId { get; set; }
public string name { get; set; }
public double salePrice { get; set; }
public string upc { get; set; }
public string shortDescription { get; set; }
public string longDescription { get; set; }
public string brandName { get; set; }
public string thumbnailImage { get; set; }
public string mediumImage { get; set; }
public string largeImage { get; set; }
public string productTrackingUrl { get; set; }
public bool ninetySevenCentShipping { get; set; }
public double standardShipRate { get; set; }
public string size { get; set; }
public string color { get; set; }
public bool marketplace { get; set; }
public bool shipToStore { get; set; }
public bool freeShipToStore { get; set; }
public string productUrl { get; set; }
public string customerRating { get; set; }
public int numReviews { get; set; }
public string customerRatingImage { get; set; }
public bool rollBack { get; set; }
public bool bundle { get; set; }
public bool clearance { get; set; }
public string stock { get; set; }
public string gender { get; set; }
public string age { get; set; }
public bool freeShippingOver50Dollars { get; set; }
public bool availableOnline { get; set; }
}
[DataContract]
public class RootObject
{
[DataMember]
public List<Item> items { get; set; }
}
}
您应该将[DataMember]
属性添加到Item类的属性中。现在只有Items列表被"检测到",Item对象被序列化为默认值
第一步:
把你的JSON放到这个站点,来构建你的c# POCO模型(http://json2csharp.com/)
步骤2:
得到Json。Net from Newtonsoft.
步骤3:
RootObject myObject = JsonConvert.DeserializeObject<RootObject>(jsonString);
返回到另一个方向:
string jsonString = JsonConvert.SerializeObject<RootObject>(myObject);
步骤4:
阅读有关Json的所有内容。因为在。Net中处理JSON比其他任何方法都要优越得多。如果你还没有尝试过,那么不妨读一读动态类型。Json。Net和c#中的动态类型=用更少的代码来做同样的事情。
最后一件事。不需要任何属性,只需要有一个空的构造函数,或者没有构造函数。