簡體   English   中英

在 C# 中以 windows 形式顯示來自 my.json 文件的數據

[英]Displaying data from my .json file in a windows form in C#

最近幾天我一直在閱讀有關此問題的文章,並且有很多類似的問題,但沒有一個對我有幫助。

我的數據在 my.json 文件中,格式如下:

{
  "Run from 27.09.2021 19:47:22": {
    "decksize": 52,
    "correctcards": 23,
    "time2mem": "00:00:5434",
    "time2sor": "00:00:4214",
    "mempalaces": [ "none" ],
    "troublecards": [ "none" ]
  }
  ,
  "Run from 27.09.2021 19:47:29": {
    "decksize": 32,
    "correctcards": 1,
    "time2mem": "00:00:5628",
    "time2sor": "00:00:5724",
    "mempalaces": [ "none" ],
    "troublecards": [ "none" ]
  },
  "Run from 27.09.2021 19:47:36": {
    "decksize": 32,
    "correctcards": 11,
    "time2mem": "00:00:6224",
    "time2sor": "00:00:5201",
    "mempalaces": [ "none" ],
    "troublecards": [ "none" ]
  }
}

我想在 datagridview 或其他任何最簡單的方法中顯示它(如果列表框更容易,那就這樣吧)。

我試圖使用Newtonsoft.Json將其反序列化為 object,但我希望找到一種僅使用System.Text.JsonSystem.Text.Json.Serialization的方法,因為這兩個在我的項目中對我有用。

我目前正在這樣反序列化: data = JsonSerializer.Deserialize<values_advanced>(jsonString); 並像這樣綁定我的數據源: dbHistory.DataSource = data; 但是當我開始我的程序時網格是空的。

我還嘗試將 jsonString 轉換為 DataTable,如下所示: var data2 = JsonConvert.DeserializeObject<List<values_advanced>>(jsonString); 但我遇到了一個錯誤,聲稱 NewtonSoft 遇到了並發症。 我在這里粘貼了整個錯誤。

任何幫助將不勝感激,因為我現在大部分空閑時間都花在了這個問題上並且它開始困擾我。

我附上了 Excel 的屏幕截圖,以可視化我希望如何可視化數據:數據

一些注意事項:您的 JSON 結構的外部類型相當於 C# 中的字典。您不能將字典類型用作視圖的數據源。 您需要將字典轉換為IEnumerable ,一個簡單的方法是通過 LINQ:

Dictionary<string, RunData> dict = JsonConvert.Deserialize<Dictionary<string, RunData>>(jsonString);
IEnumerable<RunData> data = dict.Values.ToList();
...

創建data后,您可以將 DataGridView 的數據源設置為可枚舉的。

使用 System.Text.Json 試試這個


var list = JsonSerializer.Deserialize<Dictionary<string,Data>>(json).Values.ToList();

但是您需要將 arrays 轉換為字符串才能將其用作網格視圖的數據源,所以

List<GvData> dataSource = list.Select(v => new GvData
    {
        Decksize = v.Decksize,
        Correctcards = v.Correctcards,
        Time2Mem = v.Time2Mem,
        Time2Sor = v.Time2Sor,
        Mempalaces = string.Join(",", v.Mempalaces),
        Troublecards = string.Join(",", v.Troublecards)
    }).ToList();
.....

dbHistory.DataSource = dataSource ;

public partial class Data
{
    [JsonPropertyName("decksize")]
    public long Decksize { get; set; }

    [JsonPropertyName("correctcards")]
    public long Correctcards { get; set; }

    [JsonPropertyName("time2mem")]
    public string Time2Mem { get; set; }

    [JsonPropertyName("time2sor")]
    public string Time2Sor { get; set; }

    [JsonPropertyName("mempalaces")]
    public string[] Mempalaces { get; set; }

    [JsonPropertyName("troublecards")]
    public string[] Troublecards { get; set; }
}

public partial class GvData
{
    public long Decksize { get; set; }
    public long Correctcards { get; set; }
    public string Time2Mem { get; set; }
    public string Time2Sor { get; set; }
    public string Mempalaces { get; set; }
    public string Troublecards { get; set; }
}

這應該有所幫助。 首先,您需要一個 class 來描述您的格式...

[Serializable()]
    public class MyRuns
    {
        public string Run_Name { get; set; }
        public int decksize { get; set; }
        public int correctcards { get; set; }
        public string time2mem { get; set; }
        public string time2sor { get; set; }
        public string mempalaces { get; set; }
        public string troublecards { get; set; }
    }
using System.Text.Json;

我不得不對你的 json 做一些細微的改動,但這有效......

string strJson = @"[{

    ""Run_Name"": ""Run from 27.09.2021 19:47:22"",
    ""decksize"": 52,
    ""correctcards"": 23,
    ""time2mem"": ""00:00:5434"",
    ""time2sor"": ""00:00:4214"",
    ""mempalaces"": ""none"",
    ""troublecards"": ""none""
        },
{
    ""Run_Name"": ""Run from 27.09.2021 19:47:29"",
    ""decksize"": 32,
    ""correctcards"": 1,
    ""time2mem"": ""00:00:5628"",
    ""time2sor"": ""00:00:5724"",
    ""mempalaces"": ""none"",
    ""troublecards"": ""none""
    },
  {
    ""Run_Name"": ""Run from 27.09.2021 19:47:36"",
    ""decksize"": 32,
    ""correctcards"": 11,
    ""time2mem"": ""00:00:6224"",
    ""time2sor"": ""00:00:5201"",
    ""mempalaces"": ""none"",
    ""troublecards"": ""none""
    }
]";

List<MyRuns> myRuns = JsonSerializer.Deserialize<List<MyRuns>>(strJson);

            foreach(var r in myRuns)
            {
                Console.WriteLine("--------------------------------------");
                Console.WriteLine("Run Name: " + r.Run_Name);
                Console.WriteLine("decksize: " + r.decksize);
                Console.WriteLine("correctcards: " + r.correctcards.ToString());
                Console.WriteLine("time2mem: " + r.time2mem.ToString());
                Console.WriteLine("time2sor: " + r.time2sor.ToString());
                Console.WriteLine("mempalaces: " + r.mempalaces);
                Console.WriteLine("troublecards: " + r.troublecards);
                Console.WriteLine("----------------------------------------");
            }

Output:

--------------------------------------
Run Name: Run from 27.09.2021 19:47:22
decksize: 52
correctcards: 23
time2mem: 00:00:5434
time2sor: 00:00:4214
mempalaces: none
troublecards: none
----------------------------------------
--------------------------------------
Run Name: Run from 27.09.2021 19:47:29
decksize: 32
correctcards: 1
time2mem: 00:00:5628
time2sor: 00:00:5724
mempalaces: none
troublecards: none
----------------------------------------
--------------------------------------
Run Name: Run from 27.09.2021 19:47:36
decksize: 32
correctcards: 11
time2mem: 00:00:6224
time2sor: 00:00:5201
mempalaces: none
troublecards: none
----------------------------------------

暫無
暫無

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

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