从文本文件中读取Json数据 C#

11

我有一个文本文件,其中包含以下格式的数据

[
    {
        "SponsorID": 1,
        "FirstBAID": 7395836
    },
    {
        "SponsorID": 2,
        "FirstBAID": 3509279,
        "SecondBAID": 2947210
    },
    {
        "SponsorID": 3,
        "FirstBAID": 1776294,
        "SecondBAID": 6503843
    },
    {
        "SponsorID": 4,
        "FirstBAID": 8014528,
        "SecondBAID": 6203155
    },
    {
        "SponsorID": 5,
        "FirstBAID": 5968769,
        "SecondBAID": 7410195,
        "ThirdBAID":8950170,
    }
]

我想把这些数据读取成列表,然后按SponsorID进行查询。 我创建了一个类,代码如下:

public class SponsorInfo
{
    public decimal SponsorID { get; set; }
    public decimal FirstBAID { get; set; }
    public decimal SecondBAID { get; set; }
    public decimal ThirdBAID { get; set; }
}

现在该如何读取文本文件数据并绑定 SponsorInfo 类?


5
您需要使用一个名为JSON.net的库链接 - http://www.newtonsoft.com/json/help/html/linqtojson.htm。 - Phil
这是MSDN上的一个示例:https://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx - user6522773
你可以查看以下链接:http://stackoverflow.com/a/24887573/1466583 - Maximilian Ast
4个回答

21

从NuGet包管理器控制台安装Newtonsoft.Json nuget包:

PM> Install-Package Newtonsoft.Json

那么:

var jsonText = File.ReadAllText("filepath");
var sponsors = JsonConvert.DeserializeObject<IList<SponsorInfo>>(jsonText);

要在SponsorID上查询,您可以使用LINQ:

var sponsor5 = sponsors.FirstOrDefault(x => x.SponsorID == 5);

如果您经常需要通过 SponsorID 进行查找,可以将结果转换为字典,其中键是 SponsorID。这样可以提高性能,因为它不需要在每次查找时枚举整个列表。我还建议您将 SponsorID 的类型更改为int,而不是decimal

var sponsorsById = sponsors.ToDictionary(x => x.SponsorID);

那么您可以轻松地像这样访问它:

if (sponsorsById.ContainsKey(5))
    var sponsor5 = sponsorsById[5];

3

您需要安装Newtonsoft.Json,然后使用它:

using Newtonsoft.Json;

class Program
    {
         public void LoadJson()
        {
            using (StreamReader r = new StreamReader("file.json"))
            {
                string json = r.ReadToEnd();
                List<SponsorInfo> items = JsonConvert.DeserializeObject<List<SponsorInfo>>(json);
            }
        }


        public class SponsorInfo
        {
            public decimal SponsorID { get; set; }
            public decimal FirstBAID { get; set; }
            public decimal SecondBAID { get; set; }
            public decimal ThirdBAID { get; set; }
        }




        static void Main(string[] args)
        {
            dynamic array = JsonConvert.DeserializeObject(json);
            foreach (var item in array)
            {
                Console.WriteLine("{0} {1}", item.temp, item.vcc);
            } 

        }

    }

1
未使用的 LoadJson 方法有点令人困惑。 - huysentruitw
嗯...正确,有意义。我可以将其移除并添加到Main中,但我认为应该让使用者自行决定。感谢你的建议,我支持你的答案比我好得多。 - Vicky

1
通过创建一个列表对象扩展该类。
public class SponsorInfo
{
    public decimal SponsorID { get; set; }
    public decimal FirstBAID { get; set; }
    public decimal SecondBAID { get; set; }
    public decimal ThirdBAID { get; set; }
}
public class SponsorInfoList
{
    public Dictionary<string, SponsorInfo> SIList { set; get; }
}

将文件反序列化为:
var obj = JsonConvert.DeserializeObject<SIList >(File.ReadAllText(FileName));

然后你可以阅读它,
foreach(var listItem in res.SIList )
{
    Console.WriteLine("SponsorID ={0}, FirstBAID ={1},  SecondBAID ={2}, ThirdBAID ={3}", listItem.SponsorID, listItem.FirstBAID, listItem.SecondBAID, listItem.ThirdBAID );
}

可能会有语法错误,但方法仍然相同。

随意留言!


你不需要额外的 SponsorInfoList - huysentruitw

-2

你需要像这样反序列化成你的对象:

Sponsor spon = JsonConvert.DeserializeObject<Sponsor>(json);

你将不会得到一个 SponsorInfo 对象的列表。请查看其他答案。 - huysentruitw

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