读取JSON数组并转换为IEnumerable

4

输入图像描述

我从未使用过JSON文件,但是我有一个任务需要实现JSON文件并将其转换为IEnumerable。当我尝试反序列化JSON对象时,我会收到一个异常,其中说:

Newtonsoft.Json.JsonSerializationException类型的未处理异常发生在 Newtonsoft.Json.dll 中

其他信息:无法将当前JSON对象(例如{"name":"value"})反序列化为类型“Price_Algorithm.AuctionInfo”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。

我的代码:

var data = File.ReadAllText(@"C:\benatia.json");
var terry = JsonConvert.DeserializeObject<IEnumerable<AuctionInfo>>(data);

public class AuctionInfo : IEnumerable
{
    public string BidState { get; set; }
    public uint BuyNowPrice { get; set; }
    public uint CurrentBid { get; set; }
    public int Expires { get; set; }
    public ItemData ItemData { get; set; }
    public uint StartingBid { get; set; }
    public string TradeState { get; set; }

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

我已经上传了JSON对象,以便每个人都知道整个JSON文件的内容:http://puu.sh/fancH/9a495ecbe9.json (新的JSON)


1
展示你的 AuctionInfo 代码以及它所引用的任何其他自定义类型。 - Timothy Shields
1
添加了auctionInfo代码和一个可视化的JSON截图。 - kentor
2个回答

7

使用json2csharp.com网站,你应该将反序列化的类定义如下:

public class AttributeList
{
    public int Index { get; set; }
    public int Value { get; set; }
}

public class LifeTimeStat
{
    public int Index { get; set; }
    public int Value { get; set; }
}

public class StatsList
{
    public int Index { get; set; }
    public int Value { get; set; }
}

public class ItemData
{
    public int AssetId { get; set; }
    public int Assists { get; set; }
    public List<AttributeList> AttributeList { get; set; }
    public int CardSubTypeId { get; set; }
    public int Contract { get; set; }
    public int DiscardValue { get; set; }
    public int Fitness { get; set; }
    public string Formation { get; set; }
    public object Id { get; set; }
    public int InjuryGames { get; set; }
    public string InjuryType { get; set; }
    public string ItemState { get; set; }
    public string ItemType { get; set; }
    public int LastSalePrice { get; set; }
    public int LeagueId { get; set; }
    public int LifeTimeAssists { get; set; }
    public List<LifeTimeStat> LifeTimeStats { get; set; }
    public int LoyaltyBonus { get; set; }
    public int Morale { get; set; }
    public int Owners { get; set; }
    public int PlayStyle { get; set; }
    public string PreferredPosition { get; set; }
    public int RareFlag { get; set; }
    public int Rating { get; set; }
    public int ResourceId { get; set; }
    public List<StatsList> StatsList { get; set; }
    public int Suspension { get; set; }
    public int TeamId { get; set; }
    public string Timestamp { get; set; }
    public int Training { get; set; }
    public bool Untradeable { get; set; }
    public int Pile { get; set; }
}

public class RootObject
{
    public string BidState { get; set; }
    public int BuyNowPrice { get; set; }
    public int CurrentBid { get; set; }
    public int Expires { get; set; }
    public ItemData ItemData { get; set; }
    public int Offers { get; set; }
    public string SellerEstablished { get; set; }
    public int SellerId { get; set; }
    public string SellerName { get; set; }
    public int StartingBid { get; set; }
    public object TradeId { get; set; }
    public string TradeState { get; set; }
    public object Watched { get; set; }
}

我从您发布的链接中获取了JSON数据,并将其放入文件中。我编写了一个小型控制台应用程序,实现了以下功能:
var data = File.ReadAllText("json1.json");
var auctions = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(data);

这是我构建的解决方案链接http://1drv.ms/1ChmYYx,但实际上它与我已经发布的内容没有什么区别。
完美地工作了,我得到了26个“RootObject”的实例。
如果您想,可以将“RootObject”重命名为其他内容。 我只是直接从json2charp生成的内容中复制并粘贴的。

谢谢你的帮助。我尝试了,但仍然抛出相同的异常 :/. - kentor
也许你还有其他想法?我也可以上传Visual Studio项目,尝试导入这个JSON数组吗? - kentor
有趣的是,我使用您提供的链接下载了您的JSON文件,并编写了代码,它完美地运行了。如果仍然抛出异常,则JSON不是您发布的内容,或者您没有使用我发布的类或反序列化代码,因为现在不应该再引用AuctionInfo了。我已更新正文以包含更多信息。 - Craig W.
这对我也起作用,而且类确实是相同的,唯一的区别是我直接从我的磁盘中读取json文件,而不是将其导入项目中。谢谢 :) - kentor

3
请改为以下做法:
var data = "[" + File.ReadAllText(@"C:\benatia.json") + "]";
var terry = JsonConvert.DeserializeObject<IEnumerable<AuctionInfo>>(data);

你的JSON文件有些格式不对,它包含了多个用逗号分隔的JSON对象,但却没有用方括号[ ... ]将其括起来,从而定义一个JSON数组。

我已经在你的data字符串中添加了方括号。


哦,对不起,是我把这个 '[' 和 ']' 删掉了。但是这些符号也无法工作,所以我尝试了那样做。我会上传原始的JSon文件并进行编辑。 - kentor
你有其他的想法吗? - kentor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接