【问题标题】:Read Json data from text file C#从文本文件 C# 中读取 Json 数据
【发布时间】:2023-03-06 01:21:01
【问题描述】:

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

[
    {
        "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 类?

【问题讨论】:

标签: c# json list


【解决方案1】:

从 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];

【讨论】:

    【解决方案2】:

    你需要安装 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);
                } 
    
            }
    
        }
    

    【讨论】:

    • 未使用的LoadJson 方法有点混乱。
    • 嗯...正确有道理。;我可以删除它并添加到 Main 但是,我想,我应该让它给使用的人。感谢您之间的建议,我支持您的回答比我好多了。
    【解决方案3】:

    通过创建列表对象来扩展类

    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
    【解决方案4】:

    您需要反序列化为您的对象,例如:

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

    【讨论】:

    • 您不会得到SponsorInfo 对象的列表。查看其他答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多