nic*_*qq1 7 c# json fixed visual-studio deserialization
您好我正在使用Windows窗体应用程序进入Magic The Gathering卡我已经进入数据库以便于组织.为了快速输入卡片数据,我计划使用MTG主卡Json文件,该文件包含所有卡片及其所有属性.但是他们拥有Json文件的方式似乎不适用于Visual C#中的反序列化.
这是两个条目的样子:
{
"Air Elemental":{
(stuff that doesn't matter for the question)
},
"Ancestral Recall":{
. . .
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,数据的变量名称对于问题所在的每一个都是不同的.我无法让C#将它正确地反序列化为一个类,因为它需要JsonProperty名称,因为它不同,我无法真正设置它.
因此,如果有一种方法可以指定它不需要具有特定的名称,并且它只存储放在该变量中的内容,如果您能告诉我,我将非常感激.
感谢您提供任何帮助.
解
感谢Henrik,我发现了如何解决这个问题.这是他发布的内容:
dynamic data = JsonConvert.DeserializeObject(responseData);
IDictionary<string, JToken> cards = data;
foreach (var card in cards)
{
var key = card.Key;
var value = card.Value;
}
Run Code Online (Sandbox Code Playgroud)
这不完全是我必须做的,但它奠定了解决方案的基础.我发现card.Value实际上持有了卡片的所有Json文本,所以我需要做的就是再次使用Json.DeserializeObject,但这一次进入我的类,其中所有的值都设置为变量.这是它的样子
string json;
using (StreamReader sr = new StreamReader("G:/MTG Card Database/Files/AllCardsShort.json"))
{
json = sr.ReadToEnd();
sr.Close();
}
dynamic data = JsonConvert.DeserializeObject(json);
IDictionary<string, JToken> cards = data;
foreach (var card in cards)
{
CardData newCard = JsonConvert.DeserializeObject<CardData>(card.Value.ToString());
textBox1.Text = newCard.name; //Check to see if the name can be put into a textbox
break;
}
. . .
public class CardData
{
[JsonProperty("layout")]
public string layout { get; set; }
[JsonProperty("name")]
public string name { get; set; }
[JsonProperty("manaCost")]
public string manaCost { get; set; }
[JsonProperty("cmc")]
public string cmc { get; set; }
[JsonProperty("colors")]
public string[] colors { get; set; }
[JsonProperty("type")]
public string type { get; set; }
[JsonProperty("subtypes")]
public string[] subTypes { get; set; }
[JsonProperty("text")]
public string text { get; set; }
[JsonProperty("power")]
public string power { get; set; }
[JsonProperty("toughness")]
public string toughness { get; set; }
[JsonProperty("imageName")]
public string imageName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
再次感谢Henrik的帮助.并且感谢所有发布他们想法的人!
使用Json.NET:
dynamic data = JsonConvert.DeserializeObject(responseData);
IDictionary<string, JToken> cards = data;
foreach (var card in cards)
{
var key = card.Key;
var value = card.Value;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1823 次 |
| 最近记录: |