2016-10-05 3 views
0

Hier a été le premier jour où j'ai rencontré JSON et la plupart d'exemple que je trouve était où JSON avoir le format commeC# JSON.net Désérialisation

{ "key1": "value1", "key2": "value2", ... } 

mais j'ai chaîne JSON:

{"items":[[24,68,216,34006,32224],[68,177,277,140,2130], |...skip big amount of data....| ,[79606,8500392,0,0,14]],"updated":1475686082000,"columns":["id","buy","sell","supply","demand"]} 

I essayer de comprendre comment lire ceci et obtenir une quantité spécifique de données. Par exemple, j'ai besoin d'obtenir le numéro dans la colonne "acheter" et "vendre" des ID spécifiques.

+0

http://json2csharp.com/ –

+0

Êtes-vous désérialiser l'objet ou regardiez-vous d'utiliser une chose de type XmlReader (sauf pour JSON)? Si vous le désérialisez, vous pouvez simplement utiliser LINQ. – EJoshuaS

+0

Pouvez-vous fournir une partie de votre code où vous désérialisez ce JSON? –

Répondre

2

Selon votre JSON votre modèle devrait être

public class YourRootObject 
{ 
    public List<List<int>> items { get; set; } 
    public long updated { get; set; } 
    public List<string> columns { get; set; } 
} 

et vous pouvez désérialiser comme

var obj = JsonConvert.DeserializeObject<YourRootObject>(json); 

Mais, au lieu de faire face à « mise à jour » valeur plus tard, je changerais la modèle comme ci-dessous et écrire un convertisseur de JSON.

public class YourRootObject 
{ 
    public List<List<int>> items { get; set; } 
    public DateTime updated { get; set; } 
    public List<string> columns { get; set; } 
} 

public class EpochToDatetimeConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var l = (long)reader.Value; 
     return new DateTime(1970, 1, 1).AddMilliseconds(l).ToLocalTime(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Maintenant vous pouvez désérialiser comme

var obj = JsonConvert.DeserializeObject<YourRootObject>(json, 
              new EpochToDatetimeConverter()); 
+0

Valeur mise à jour pas vraiment date lui-même, il est plus comme le numéro de série – Dante4

+1

@ Dante4 Peut-être, mais il renvoie «5 octobre 2016 19: 48: 02». Juste un jugement? –

+0

ou .. alors nvm :) je suppose qu'il est logique .. encore ce n'est pas vraiment ressemble à la date .. – Dante4

0

Comme a dit dans @ Alex les commentaires:

En ce qui va le lire, tout contenu à l'intérieur [] est considéré comme un tableau. Le champ "items" est donc un tableau contenant des tableaux

Si vous ne voulez pas avoir cette matrice de tableaux, vous pouvez créer une nouvelle classe pour encapsuler le tableau interne. Par exemple:

{ 
    "items": 
    [ 
     { "numbers": [24,68,216,34006,32224] }, 
     { "numbers": [68,177,277,140,2130] }, 
     |...skip big amount of data....| , 
     { "numbers": [79606,8500392,0,0,14]], 
    ], 
    "updated": 1475686082000, 
    "columns": [ "id", "buy", "sell", "supply", "demand"] 
} 

Et vos classes en C# serait:

public class Parent 
{ 
    public List<Child> items; 
    public int updated; 
    public string[] columns; 

    public Parent() 
    { 
    items = new List<Child>(); 
    } 
} 

public class Child 
{ 
    public string[] numbers; 
} 

Quelque chose comme ça.

+0

Merci pour ce point, je suppose que je fais encore quelque chose de mal, parce que j'ai eu NULL dans Parent.items, j'ai essayé de le faire "Parent ItemsNew = JsonConvert.DeserializeObject (File.ReadAllText (@" C: \ \ items.json ")); – Dante4

+0

Pouvez-vous essayer d'utiliser un constructeur à l'intérieur de la classe Parent?' public Parent() {items = new Liste ();} ' Je mettrai à jour ma réponse si cela fonctionne –

+0

@" Rick Wolff "Error" Impossible de désérialiser le tableau JSON en cours (par exemple [1,2,3]) dans le type "WindowsFormsApplication1.Form1 + Child" car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement ... Chemin 'articles [0]', ligne 1, position 11. " – Dante4