2012-05-20 46 views
5

Đây là lần đầu tiên tôi sử dụng json.net và tôi không thể tìm ra. Đây là mã của tôi dưới đây.Không thể deserialize json bằng cách sử dụng json.net

// Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void btnRefreshTweets_Click(object sender, RoutedEventArgs e) 
    { 
     string ServerURL = @"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/1/query?text=e&geometry=&geometryType=esriGeometryPoint&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&objectIds=&where=&time=&returnCountOnly=false&returnIdsOnly=false&returnGeometry=false&maxAllowableOffset=&outSR=&outFields=&f=json"; 

     WebClient webClient = new WebClient(); 
     webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted); 
     webClient.DownloadStringAsync(new Uri(ServerURL)); 
    } 

    void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      return; 
     } 
     List<Attributes> tweets = JsonConvert.DeserializeObject<List<Attributes>>(e.Result); 
     this.lbTweets.ItemsSource = tweets; 
    } 

    public class Attributes 
    { 
     public string STATE_NAME { get; set; } 
    } 

Tôi không thể deserialize các thuộc tính STATE_NAME. Tôi đang thiếu gì?

tôi tiếp tục nhận được lỗi này

"Không thể deserialize đối tượng JSON vào loại 'System.Collections.Generic.List`1 [WPJsonSample.MainPage + Thuộc tính]'. Line 1, vị trí 20."

+0

Các JSON không chỉ là một danh sách, nó có những thứ khác nữa, như "displayFieldName", "fieldAliases", "cánh đồng và 'tính năng' (của bạn Tôi không chắc chắn nếu điều đó làm cho một sự khác biệt cho json.net, nhưng hãy thử làm cho một đối tượng để chứa tất cả trong số họ có thể? – blitzen

+0

Tôi sẽ kiểm tra bài đăng này trước khi tiếp tục với json.net.Đây là chết đơn giản: http: //www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx –

Trả lời

3

Các JSON trở về từ url đó là:

{ 
    "displayFieldName": "STATE_NAME", 
    "fieldAliases": { 
    "STATE_NAME": "STATE_NAME" 
    }, 
    "fields": [ 
    { 
     "name": "STATE_NAME", 
     "type": "esriFieldTypeString", 
     "alias": "STATE_NAME", 
     "length": 25 
    } 
    ], 
    "features": [ 
    { 
     "attributes": { 
     "STATE_NAME": "Maine" 
     } 
    } 
} 

Vì vậy, chúng ta có thể thấy ở đây gốc là một đối tượng, không phải là một đếm được như một List<>

Bạn sẽ phải sửa cấu trúc lớp để khớp với JSON hoặc truy cập nó bằng các truy vấn LINQ (có một số mẫu trong trang web json.net).

7

Dưới đây là cấu trúc lớp học của bạn (tôi đã sử dụng http://json2csharp.com/)

public class FieldAliases 
{ 
    public string STATE_NAME { get; set; } 
} 

public class Field 
{ 
    public string name { get; set; } 
    public string type { get; set; } 
    public string alias { get; set; } 
    public int length { get; set; } 
} 

public class Attributes 
{ 
    public string STATE_NAME { get; set; } 
} 

public class Feature 
{ 
    public Attributes attributes { get; set; } 
} 

public class RootObject 
{ 
    public string displayFieldName { get; set; } 
    public FieldAliases fieldAliases { get; set; } 
    public List<Field> fields { get; set; } 
    public List<Feature> features { get; set; } 
} 
3

NẾU bạn đang cố gắng để đạt điểm cuối đó, bạn không nên tự nộp truy vấn, bạn nên sử dụng ArcGIS WP7 SDK (đó là miễn phí!). Sau đó sử dụng QueryTask.

(nếu bạn chỉ cần giúp đỡ về phân tích cú pháp JSON, xem dưới đây)

QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/1/"); 
    queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted; 
    queryTask.Failed += QueryTask_Failed; 

    ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query(); 
    query.Text = "e"; 
    query.ReturnGeometry = false; 

    queryTask.ExecuteAsync(query); 


private void QueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args) 
{ 
    FeatureSet featureSet = args.FeatureSet 
    // use the featureSet to do something. It contains everything you need 
} 

Nếu vì lý do gì, bạn không muốn sử dụng QueryTask, bạn vẫn có thể sử dụng phương pháp FromJson của featureset

void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    var featureSet = ESRI.ArcGIS.Client.Tasks.FeatureSet.FromJson(e.Result); 
    // Use it 
} 

Nếu bạn cần trợ giúp về JSON, dưới đây là một số khái niệm chính.

1) Niềng răng xoăn đại diện cho một đối tượng

2) dấu ngoặc vuông đại diện cho một mảng.

3) các thuộc tính được phân cách bằng dấu phẩy

Khi sử dụng JSON.NET, bạn nên thêm thuộc tính JsonProperty vào thuộc tính. Bằng cách này bạn có thể duy trì tên riêng ngay cả khi json hút

[JsonProperty("STATE_NAME")] 
public string StateName { get; set; } 
Các vấn đề liên quan