使用不同变量名称的Json反序列化(FIXED Posted Solution)

时间:2015-05-16 04:48:59

标签: c# json visual-studio deserialization fixed

您好我正在使用Windows窗体应用程序进入Magic The Gathering卡我已经进入数据库以便于组织。为了快速输入卡数据,我计划使用MTG主卡Json文件,该文件包含所有制作的卡及其所有属性。但是他们拥有Json文件的方式似乎与Visual C#中的反序列化无关。

以下是两个条目:

{
"Air Elemental":{
(stuff that doesn't matter for the question)
},
"Ancestral Recall":{
. . .
}
}

正如您所看到的,数据的变量名称对于问题所在的每一个都是不同的。我无法通过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;
}

这不完全是我必须做的事情,但它奠定了解决方案的基础。我发现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; }
}

再次感谢Henrik的帮助。并感谢所有发布他们想法的人!

2 个答案:

答案 0 :(得分:6)

使用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;
}

答案 1 :(得分:0)

这可能是你想要的吗?查看Tom Peplow的回答

yii2-cookbook

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;