无法使用json.net反序列化json

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个位置。"


JSON 不仅仅是一个列表,它还有其他的东西,比如 "displayFieldName"、"fieldAliases"、"fields" 和 "features"(你的列表)。我不确定这是否会对 json.net 产生影响,但是可以尝试创建一个对象来容纳它们吗? - user798182
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; }
}

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; }

2
那个网址返回的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网站上有一些示例)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接