2012-05-20 40 views
5

Esta es la primera vez que uso json.net y no puedo resolverlo. Aquí está mi código a continuación.No se puede deserializar json usando 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; } 
    } 

No puedo deserializar los atributos STATE_NAME. ¿Qué me estoy perdiendo?

sigo recibiendo este error

"No se puede deserializar objeto JSON en tipo 'System.Collections.Generic.List`1 [+ WPJsonSample.MainPage Atributos]'. Línea 1, la posición 20."

+0

El JSON no es sólo una lista, tiene otras cosas también, como "displayFieldName", "fieldAliases", "campos y 'características' (su lista). No estoy seguro de si eso hace una diferencia para json.net, pero trate de hacer un objeto para dar cabida a todos ellos tal vez? – blitzen

+0

Me gustaría pagar esta publicación antes de continuar con json.net. Esto es muy simple: http: //www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx –

Respuesta

3

El JSON devuelto desde esa URL es:

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

Así, podemos ver aquí la raíz es un objeto, no un enumerable como un List<>

Vas a tener que arregle la estructura de la clase para que coincida con el JSON, o acceda a él con consultas Linq (hay algunas muestras de esto en el sitio web json.net).

7

Aquí es su estructura de clases (utilicé 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

si usted está tratando de llegar a ese punto final, usted no debe ser manualmente enviar la consulta, se debe utilizar el ArcGIS WP7 SDK (es gratis!). Luego usa QueryTask.

(si sólo necesita ayuda con el análisis de JSON, véase más adelante)

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 
} 

Si por cualquier razón, usted no desea utilizar el QueryTask, todavía se puede utilizar el método FromJson del FeatureSet

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

Si necesita ayuda con JSON, estos son algunos conceptos clave.

1) Las llaves representan un objeto

2) corchetes representan una matriz.

3) propiedades están separados por comas

Al utilizar JSON.NET, se debe añadir el atributo JsonProperty a una propiedad. De esta forma puede mantener los nombres propios, incluso si el JSON chupa

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