2012-05-20 149 views
5

這是我第一次使用json.net,我無法弄清楚。以下是我的代碼如下。無法反序列化json使用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; } 
    } 

我無法反序列化STATE_NAME屬性。我錯過了什麼?

我不斷收到這個錯誤

「不能反序列化JSON對象到 類型 'System.Collections.Generic.List`1 [WPJsonSample.MainPage +屬性]'。 行1,位置20」。

+0

的JSON不只是一個列表,它有其他的東西太多,像「displayFieldName」,「fieldAliases」,「區域和‘功能’(您的我不確定這對json.net有什麼影響,但是可以嘗試讓一個對象容納所有這些對象嗎? – blitzen

+0

我會在繼續使用json.net之前檢出這個帖子,這很簡單:http: //www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx –

回答

3

的JSON從URL返回的是:

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

所以,我們可以看到這裏的根是一個對象,而不是一個枚舉像List<>

你必須修復類結構以匹配JSON,或者使用Linq查詢訪問它(在json.net網站中有一些這樣的示例)。

7

這裏是你的類結構(我用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

,如果你是想打的終點,你不應該手動提交的查詢,您應該使用ArcGIS WP7 SDK(它是免費的!)。然後使用QueryTask。

(如果你只需要解析JSON的幫助,見下文)

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 
} 

如果因任何原因,你不希望使用QueryTask,你仍然可以使用的FeatureSet的FromJson方法

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

如果您需要JSON幫助,以下是一些重要概念。

1)大括號表示對象

2)的方括號表示的陣列。

3)性質由逗號

分離當使用JSON.NET,則應將JsonProperty屬性添加到一個屬性。這樣你就可以保持適當的名稱,即使JSON吸

[JsonProperty("STATE_NAME")] 
public string StateName { get; set; }