簡體   English   中英

在C#中使用JSON反序列化為字典

[英]Using JSON in C# deserialized into a dictionary

我將JSON數據反序列化為字典。 這就是我的JSON數據:

{
    "InputKoffRetStats":true,"InputPenaltyStats":false,
    "VisitingTeamFootballRbStats":
         [{
             "AthleteLastName":"John",
             "AthleteFirstName":"Smith","Number":9,"IsPresent":true
         },
         {
             "AthleteLastName":"Justin",
             "AthleteFirstName":"Brooks","Number":10,"IsPresent":false
         }]
}

這就是我將字符串反序列化為字典的方式:

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);

我遇到的問題是我不知道如何獲得,例如,第一個運動員的姓(約翰)。

如果我這樣做:

 Console.WriteLine(dict["InputKoffRetStats"]);

然后我得到“真實”。 它工作正常。

如果我這樣做:

Console.WriteLine(dict["VisitingTeamFootballRbStats"]);

然后我得到了兩位運動員的信息(約翰和賈斯汀)。

我怎么能用字典才能得到第一個運動員的名字? 我嘗試了以下操作但沒有成功:

Console.WriteLine(dict["VisitingTeamFootballRbStats"][0]);

有任何想法嗎?

編輯:我應該提到我展示的json只是整個json的一小部分。 我只是舉了一個例子。

一個完整的工作示例:

public class Athlete
{
    public string AthleteLastName { get; set; }
    public string AthleteFirstName { get; set; }
    public int Number { get; set; }
    public bool IsPresent { get; set; }
}

public class Stat
{
    public bool InputKoffRetStats { get; set; }
    public bool InputPenaltyStats { get; set; }
    public List<Athlete> VisitingTeamFootballRbStats { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var jsonText = "{" +
                        "    \"InputKoffRetStats\":true,\"InputPenaltyStats\":false," +
                        "    \"VisitingTeamFootballRbStats\":" +
                        "         [{" +
                        "             \"AthleteLastName\":\"John\"," +
                        "             \"AthleteFirstName\":\"Smith\",\"Number\":9,\"IsPresent\":true" +
                        "         }," +
                        "         {" +
                        "             \"AthleteLastName\":\"Justin\"," +
                        "             \"AthleteFirstName\":\"Brooks\",\"Number\":10,\"IsPresent\":false" +
                        "         }]" +
                        "}";

        var stat = JsonConvert.DeserializeObject<Stat>(jsonText);

        Console.WriteLine(stat.VisitingTeamFootballRbStats[0].AthleteFirstName);
        Console.ReadKey();
    }
}

PS。:您提供的JSON中存在錯誤。 一旦你使用"IsPresent"作為布爾值: "IsPresent":true ,下次你將它用作字符串時: "IsPresent":No (錯誤地,因為No應該是“No”)。 無論如何,我更正了"IsPresent":false

更新 :如果你想要“類似JavaScript”的行為,那么你希望能夠做someObj["someProperty"]["someNestedProperty"]你可以這樣做:

var stat = JsonConvert.DeserializeObject<JObject>(jsonText);

所以要獲得第一名運動員的名字:

var firstName = stat["VisitingTeamFootballRbStats"][0]["AthleteFirstName"].Value<string>();

也就是說,我仍然會為JSON中的所有可能字段創建適當的類。

反序列化的另一種方法是創建一個JsonProperty類,如下所示:

public class VisitingTeamFootballRbStats
{
    [JsonProperty("AthleteLastName")]
    public string AthleteLastName{ get; set; }

    [JsonProperty("AthleteFirstName")]
    public string AthleteFirstName{ get; set; }

    [JsonProperty("Number")]
    public string Number{ get; set; }

    [JsonProperty("IsPresent")]
    public string IsPresent{ get; set; }
}

然后將其反序列化如下:

List<VisitingTeamFootballRbStats> visitingTeams = JsonConvert.DeserializeObject<List<VisitingTeamFootballRbStats>>(jsonString["VisitingTeamFootballRbStats"].ToString());

因此,一旦您獲得列表,您可以輕松獲得運動員的詳細信息如下:

visitingTeams.ElementAt(0).AthleteLastName;

或者你可以使用linq。

你的代碼不起作用,因為你的json對象不是字典,這里是一個自定義對象,它看起來像是一個序列化的字典

{"team1":[{"AthleteLastName":"v2",
"AthleteFirstName":"v1",
"Number":2,
"IsPresent":false}]}

這里有一個完整的例子

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
           var team=  "{" +
                       "    \"InputKoffRetStats\":true,\"InputPenaltyStats\":false," +
                       "    \"VisitingTeamFootballRbStats\":" +
                       "         [{" +
                       "             \"AthleteLastName\":\"John\"," +
                       "             \"AthleteFirstName\":\"Smith\",\"Number\":9,\"IsPresent\":true" +
                       "         }," +
                       "         {" +
                       "             \"AthleteLastName\":\"Justin\"," +
                       "             \"AthleteFirstName\":\"Brooks\",\"Number\":10,\"IsPresent\":false" +
                       "         }]" +
                       "}";





            var desTeam = JsonConvert.DeserializeObject<Team>(team);  
            Console.WriteLine(desTeam.VisitingTeamFootballRbStats[0].AthleteFirstName);



        }
    }

    public class Team{
        public bool InputKoffRetStats { get; set; }
        public bool InputPenaltyStats { get; set; }
        public  List<AthleteInfo> VisitingTeamFootballRbStats { get; set; }

    }

    public class AthleteInfo
    {
        public string AthleteLastName { get; set; }
        public string AthleteFirstName { get; set; }
        public int Number { get; set; }
        public bool IsPresent { get; set; }
    }
}

UPDATE

如果你使用webapi / wcf,你可以要求數據合同,否則你可以使用動態對象

請注意,通過使用動態對象,您將失去intellisense的支持

//same json string  

 dynamic desDynTeam = JObject.Parse(team);     
             Console.WriteLine(desDynTeam.VisitingTeamFootballRbStats[0].AthleteLastName); 

VisitingTeamFootballRbStats數組變得很長,或者JSON中的外部有其他字段。 如果JSON是已知的並且不會改變,我仍然會在我的.NET項目中添加適當的類並反序列化。

dict["VisitingTeamFootballRbStats"][0]您提供整個Athlete對象。

要訪問名稱,請使用.AthleteFirstName

像這樣:

dict["VisitingTeamFootballRbStats"][0].AthleteFirstName

你有沒有檢查過.NET中的動態 這是一個使用Newtonsoft.Json的簡單控制台應用程序 ,它顯示了如何在JSON對象上訪問這些屬性:

static void Main(string[] args)
{
    dynamic dObject = JObject.Parse(json);

    Console.WriteLine(dObject.VisitingTeamFootballRbStats[0].AthleteLastName); 
    //Prints "John"

    Console.ReadLine();
}

private static string json = @"
    {
        'InputKoffRetStats':true,'InputPenaltyStats':false,
        'VisitingTeamFootballRbStats':
        [{
            'AthleteLastName':'John',
            'AthleteFirstName':'Smith','Number':9,'IsPresent':true
        },
        {
            'AthleteLastName':'Justin',
            'AthleteFirstName':'Brooks','Number':10,'IsPresent':false
        }]
    }
    ";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM