2013-02-05 26 views
7

Tôi có một số dữ liệu JSON mà trông như thế này:Phân tích thông qua JSON trong JSON.NET với tên thuộc tính không rõ

{ 
    "response":{ 
    "_token":"StringValue", 
    "code":"OK", 
    "user":{ 
    "userid":"2630944", 
    "firstname":"John", 
    "lastname":"Doe", 
    "reference":"999999999", 
    "guid":"StringValue", 
    "domainid":"99999", 
    "username":"jdoe", 
    "email":"[email protected]", 
    "passwordquestion":"", 
    "flags":"0", 
    "lastlogindate":"2013-02-05T17:54:06.31Z", 
    "creationdate":"2011-04-15T14:40:07.22Z", 
    "version":"3753", 
    "data":{ 
     "aliasname":{ 
     "$value":"John Doe" 
     }, 
     "smsaddress":{ 
     "$value":"[email protected]" 
     }, 
     "blti":{ 
     "hideemail":"false", 
     "hidefullname":"false" 
     }, 
     "notify":{ 
     "grades":{ 
      "$value":"0" 
      }, 
      "messages":{ 
      "$value":"1" 
      } 
     }, 
     "beta_component_courseplanexpress_1":{ 
     "$value":"true" 
     } 
    } 
    } 
} 

Tôi đang sử dụng C# với JSON.NET để phân tích qua các dữ liệu. Tôi đã có thể nhận dữ liệu thành công bằng thuật toán này:

User MyUser = new User(); 
JToken data = JObject.Parse(json); 
MyUser.FirstName = (string) data.SelectToken("response.user.firstname"); 
//The same for all the other properties. 

Vấn đề là với trường data. Trường này dựa trên sở thích người dùng chủ yếu và dữ liệu chỉ được chèn vào khi nó được sử dụng. Các trường là tất cả các tùy chỉnh và các nhà phát triển có thể đưa vào bao nhiêu tùy thích mà không bị hạn chế. Về cơ bản, đó là tất cả dữ liệu biểu mẫu tự do. Cũng như bạn nhận thấy họ có thể được lồng nhau thực sự xa với dữ liệu.

tôi đã cố gắng để chạy:

MyUser.Data = JsonConvert.DeserializeObject<List<JToken>>((string) data.SelectToken("response.user.data"); 

mà không hoạt động.

Bạn sẽ chuyển đổi nó như thế nào để sử dụng trong đối tượng C#?

+0

@KenKin Hiện tại tôi đang xem từ điển để lưu trữ dữ liệu. Các biến thành viên khác là các thuộc tính chuỗi đơn giản giúp dễ dàng truy cập qua MyUser.FirstName. Câu hỏi thực sự tập trung vào phần 'dữ liệu' của JSON, phần còn lại hoàn toàn là để tham khảo. – claydiffrient

Trả lời

11

Bạn có thể truy cập nó thông qua JToken/JArray/JObject phương pháp. Ví dụ: danh sách này sẽ liệt kê tất cả các khóa trong dữ liệu:

public class StackOverflow_14714085 
{ 
    const string JSON = @"{ 
          ""response"": { 
          ""_token"": ""StringValue"", 
          ""code"": ""OK"", 
          ""user"": { 
           ""userid"": ""2630944"", 
           ""firstname"": ""John"", 
           ""lastname"": ""Doe"", 
           ""reference"": ""999999999"", 
           ""guid"": ""StringValue"", 
           ""domainid"": ""99999"", 
           ""username"": ""jdoe"", 
           ""email"": ""[email protected]"", 
           ""passwordquestion"": """", 
           ""flags"": ""0"", 
           ""lastlogindate"": ""2013-02-05T17:54:06.31Z"", 
           ""creationdate"": ""2011-04-15T14:40:07.22Z"", 
           ""version"": ""3753"", 
           ""data"": { 
           ""aliasname"": { 
            ""$value"": ""John Doe"" 
           }, 
           ""smsaddress"": { 
            ""$value"": ""[email protected]"" 
           }, 
           ""blti"": { 
            ""hideemail"": ""false"", 
            ""hidefullname"": ""false"" 
           }, 
           ""notify"": { 
            ""grades"": { 
            ""$value"": ""0"" 
            }, 
            ""messages"": { 
            ""$value"": ""1"" 
            } 
           }, 
           ""beta_component_courseplanexpress_1"": { 
            ""$value"": ""true"" 
           } 
           } 
          } 
          } 
         }"; 

    public static void Test() 
    { 
     var jo = JObject.Parse(JSON); 
     var data = (JObject)jo["response"]["user"]["data"]; 
     foreach (var item in data) 
     { 
      Console.WriteLine("{0}: {1}", item.Key, item.Value); 
     } 
    } 
} 
+0

Cho đến nay phương pháp này có vẻ là nội tuyến nhất với những gì tôi đang cố gắng làm. Tôi sẽ để nó mở một chút trước khi tôi chấp nhận điều này như là câu trả lời. – claydiffrient

10

Json.NET thực sự có thể phân tích cú pháp thành động nếu điều đó hữu ích cho bạn. Điều đó có nghĩa là bạn có thể làm điều gì đó tương tự.

dynamic parsedObject = JsonConvert.DeserializeObject("{ test: \"text-value\" }"); 

parsedObject["test"]; // "text-value" 
parsedObject.test; // "text-value" 
parsedObject.notHere; // null 

Chỉnh sửa: có thể phù hợp hơn để bạn lặp lại các giá trị nếu bạn không biết mình đang tìm gì.

dynamic parsedObject = JsonConvert.DeserializeObject("{ test: { inner: \"text-value\" } }"); 
foreach (dynamic entry in parsedObject) 
{ 
    string name = entry.Name; // "test" 
    dynamic value = entry.Value; // { inner: "text-value" } 
} 
Các vấn đề liên quan