2015-05-16 16 views
5

Xin chào tôi đang làm việc trên một ứng dụng biểu mẫu cửa sổ để nhập vào thẻ Gathering Magic Tôi có vào một cơ sở dữ liệu để tổ chức dễ dàng. Để nhập dữ liệu thẻ nhanh, tôi dự định sử dụng tệp Json master card JG chứa tất cả các thẻ được tạo và tất cả các thuộc tính của nó. Nhưng cách họ có các tập tin Json dường như không hoạt động tốt với deserialization trong Visual C#.Json deserialization với các tên biến khác nhau (FIXED Posted Solution)

Đây là những gì hai mục như sau:

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

Như bạn có thể thấy tên biến cho dữ liệu là khác nhau cho mỗi một đơn đó là nơi mà vấn đề nằm. Tôi không thể có được C# để deserialize nó một cách chính xác vào một lớp bởi vì nó muốn tên JsonProperty và bởi vì nó là khác nhau tôi không thể thực sự thiết lập nó. Vì vậy, nếu có một cách để xác định rằng nó không cần phải có một tên cụ thể và nó chỉ lưu trữ những gì được đặt trong biến đó tôi thực sự sẽ đánh giá cao nếu bạn có thể cho tôi biết.

Cảm ơn bạn vì bất kỳ trợ giúp nào bạn có thể cung cấp.

SOLUTION

Nhờ Henrik tôi phát hiện ra làm thế nào để khắc phục vấn đề này. Đây là những gì ông gửi:

dynamic data = JsonConvert.DeserializeObject(responseData); 
IDictionary<string, JToken> cards = data; 

foreach (var card in cards) 
{ 
    var key = card.Key; 
    var value = card.Value; 
} 

nào là không hoàn toàn những gì tôi phải làm nhưng nó đặt ra nền tảng của giải pháp. Tôi đã phát hiện ra rằng thẻ.Value thực sự đã giữ tất cả văn bản Json của thẻ nên tất cả những gì tôi cần làm là sử dụng Json.DeserializeObject một lần nữa nhưng lần này vào lớp của tôi có tất cả các giá trị được đặt thành các biến. Đây là hình thức trông giống như

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

Vì vậy, một lần nữa cảm ơn Henrik đã giúp đỡ. Và cảm ơn tất cả những người khác đã đăng ý tưởng của họ!

+0

bạn đã thử một 'điển '? –

+0

http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object –

Trả lời

4

Sử dụng 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; 
} 
+0

Cảm ơn bạn rất nhiều điều này đã làm việc hoàn hảo! Chỉ cần phải deserialize thẻ.Value vào CardData. Một lần nữa cảm ơn bạn! – nickqqqq1

0

Đây có phải là điều bạn đang tìm kiếm không? Kiểm tra Tom Peplow của câu trả lời ở đây

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; 
Các vấn đề liên quan