2012-05-20 30 views
5

これは初めてjson.netを使用しているため、わかりません。以下は私のコードです。json.netを使用してjsonを逆シリアル化できません

// 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属性を逆シリアル化できません。私は何が欠けていますか?

私は、 " '[WPJsonSample.MainPage +属性] System.Collections.Generic.List`1' をタイプ にJSONオブジェクトをデシリアライズすることはできません。 ライン1、位置20" このエラーに

を得続けますJSONはそのURLから返さ

+0

を吸う場合でも、固有名詞を維持することができますこの方法では、それが「displayFieldName」のように、あまりにも他のものを持っている、「fieldAliases」、「フィールドと 『機能』(あなたのjson.netと違いがあるのか​​どうかは分かりませんが、それらをすべて収容するオブジェクトを作成しようとしたらどうでしょうか? – blitzen

+0

json.netに進む前にこの投稿をチェックアウトします。 //www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx –

答えて

3

がある:だから

{ 
    "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は、JSONはリストだけではありません

[JsonProperty("STATE_NAME")] 
public string StateName { get; set; } 
関連する問題