Json 使用不同的变量名进行反序列化(修复后的解决方案)
Json deserialization with different variable names (FIXED Posted Solution)
您好,我正在开发一个 windows 表单应用程序,用于将我拥有的 Magic The Gathering 卡片输入数据库以便于组织。为了快速输入卡数据,我计划使用 MTG 主卡 Json 文件,其中包含制作的每张卡及其所有属性。但是他们拥有 Json 文件的方式似乎不适用于 Visual C# 中的反序列化。
下面是两个条目的样子:
{
"Air Elemental":{
(stuff that doesn't matter for the question)
},
"Ancestral Recall":{
. . .
}
}
如您所见,数据的变量名称对于每个变量名称都是不同的,这就是问题所在。我无法让 C# 将其正确反序列化为 class,因为它需要 Json属性 名称,而且因为它不同,我无法真正设置它。
因此,如果有一种方法可以指定它不需要特定的名称,它只存储放置在该变量中的内容,如果您能告诉我,我将不胜感激。
感谢您提供的任何帮助。
解决方案
感谢 Henrik,我找到了解决此问题的方法。以下是他发布的内容:
dynamic data = JsonConvert.DeserializeObject(responseData);
IDictionary<string, JToken> cards = data;
foreach (var card in cards)
{
var key = card.Key;
var value = card.Value;
}
这不完全是我必须做的,但它奠定了解决方案的基础。我发现 card.Value 实际上包含了卡片的所有 Json 文本,所以我需要做的就是再使用一次 Json.DeserializeObject 但这次进入我的 class将所有值设置为变量。这是它的样子
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; }
}
再次感谢 Henrik 的帮助。也感谢所有发布他们想法的人!
这会是您要找的吗?在此处查看 Tom Peplow 的回答
Deserialize JSON into C# dynamic object?
dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;
使用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;
}
您好,我正在开发一个 windows 表单应用程序,用于将我拥有的 Magic The Gathering 卡片输入数据库以便于组织。为了快速输入卡数据,我计划使用 MTG 主卡 Json 文件,其中包含制作的每张卡及其所有属性。但是他们拥有 Json 文件的方式似乎不适用于 Visual C# 中的反序列化。
下面是两个条目的样子:
{
"Air Elemental":{
(stuff that doesn't matter for the question)
},
"Ancestral Recall":{
. . .
}
}
如您所见,数据的变量名称对于每个变量名称都是不同的,这就是问题所在。我无法让 C# 将其正确反序列化为 class,因为它需要 Json属性 名称,而且因为它不同,我无法真正设置它。
因此,如果有一种方法可以指定它不需要特定的名称,它只存储放置在该变量中的内容,如果您能告诉我,我将不胜感激。
感谢您提供的任何帮助。
解决方案
感谢 Henrik,我找到了解决此问题的方法。以下是他发布的内容:
dynamic data = JsonConvert.DeserializeObject(responseData);
IDictionary<string, JToken> cards = data;
foreach (var card in cards)
{
var key = card.Key;
var value = card.Value;
}
这不完全是我必须做的,但它奠定了解决方案的基础。我发现 card.Value 实际上包含了卡片的所有 Json 文本,所以我需要做的就是再使用一次 Json.DeserializeObject 但这次进入我的 class将所有值设置为变量。这是它的样子
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; }
}
再次感谢 Henrik 的帮助。也感谢所有发布他们想法的人!
这会是您要找的吗?在此处查看 Tom Peplow 的回答
Deserialize JSON into C# dynamic object?
dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;
使用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;
}