4

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+Attributes]' に逆シリアル化できません。1 行目、20 番目の位置。」

4

3 に答える 3

6

これがあなたのクラス構造です(私は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; }
}
于 2012-05-20T23:33:05.680 に答える
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; }
于 2012-05-21T00:17:07.783 に答える
2

その URL から返される JSON は次のとおりです。

{
  "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 Web サイトにいくつかのサンプルがあります)。

于 2012-05-20T23:21:50.420 に答える