将JSON字符串存储在C#中,然后访问其中的各个部分

本文关键字:访问 个部 然后 字符串 JSON 存储 | 更新日期: 2023-09-27 18:26:14

我正在从API中提取一些JSON。它有以下格式:

{"yourname": {
"id": 42728521,
"name": "Your Name",
"profileIconId": 27,
"revisionDate": 1397930999000,
"summonerLevel": 1
}}

但是,它被存储为:

"{'"yourname'":{'"id'":42728521,'"name'":'"Your Name'",'"profileIconId'":27,'"summonerLevel'":1,'"revisionDate'":1397930999000}}"

在绳子里面。

我希望能够调用callerLevel并返回正确的值。

我一直在尝试这个:

using (var client = new WebClient())
        {
            api_return = client.DownloadString(api_call_key);
        }
 var foo = JsonConvert.DeserializeObject<Summoner>(api_return);
        Console.WriteLine(Summoner.id);
        Console.WriteLine(Summoner.name);
        Console.WriteLine(Summoner.summonerLevel);
        string id_ = foo.ToString();
        Console.WriteLine(id_);
        Console.ReadKey();
    }
    public class Summoner
    {
        public static int id { get; set; }
        public static string name { get; set; }
        public static int summonerLevel { get; set; }
    }

然而,这只是打印出来:

0没有什么0

将JSON字符串存储在C#中,然后访问其中的各个部分

这里有两个问题,它们都阻止您从JSON中获取数据。

第一个问题是,正如Vikas所指出的,Summoner类的属性不应该是static。这样定义你的类:

public class Summoner
{
    public int id { get; set; }
    public string name { get; set; }
    public int summonerLevel { get; set; }
}

第二个问题是您的JSON结构与您正在反序列化的内容不匹配。idnamesummonerLevel属性不在JSON的根级别,它们位于另一个对象内部的下一级。因此,您需要将其反序列化为"包装"Summoner的某个类。如果JSON中的yourname属性是一个固定值,那么可以定义一个像这样的Wrapper类来反序列化为:

public class Wrapper
{
    [JsonProperty("yourname")]
    public Summoner Summoner { get; set; }
}

然而,由于JSON中的yourname属性可能不是固定值(它可能会因不同的调用程序而更改),我建议反序列化为Dictionary<string, Summoner>,如下所示:

var dict = JsonConvert.DeserializeObject<Dictionary<string, Summoner>>(json);

从那里,您可以循环遍历字典键值对,或者,如果您只期望一个,您可以使用First()来获取它

var summoner = dict.First().Value;

这是一个完整的演示:

string json = @"{""yourname"": {
                ""id"": 42728521,
                ""name"": ""Your Name"",
                ""profileIconId"": 27,
                ""revisionDate"": 1397930999000,
                ""summonerLevel"": 1
                }}";
var dict = JsonConvert.DeserializeObject<Dictionary<string, Summoner>>(json);
var summoner = dict.First().Value;
Console.WriteLine(summoner.id);
Console.WriteLine(summoner.name);
Console.WriteLine(summoner.summonerLevel);

输出:

42728521
Your Name
1

Summoner类中的属性不应为static

using (var client = new WebClient())
{
    api_return = client.DownloadString(api_call_key);
}
var foo = JsonConvert.DeserializeObject<Summoner>(api_return);
Console.WriteLine(foo.id);
Console.WriteLine(foo.name);
Console.WriteLine(foo.summonerLevel);
..............
}
public class Summoner
{
    public int id { get; set; }
    public string name { get; set; }
    public int summonerLevel { get; set; }
}