2009-10-07 8 views
1

comment puis-je transformer ce JSON à une liste d'objets qui ont deux propriétés d'abord "id" et deuxième "réponse"?Comment puis-je analyser ce fichier avec .net?

[["9","3"],["8","4"],["7","4"],["6","5"],["5","6"],["4","4"],["3","4"]] 
+0

Je suppose que vous passez cet objet JSON à un service Web . Utilisez-vous des services asmx ou wcf sur votre serveur? –

+0

@Ariel Popovsky: oui –

Répondre

0

Voici une solution utilisant l'expression rationnelle

string data = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]"; 

var pairs = (from Match m in Regex.Matches(data, "\"[0-9]\"\\,\"[0-9]\"") 
      select m.Value.Split(',')).ToDictionary(d => d[0], d => d[1]); 

Ajouté: si vous voulez que les valeurs résultantes comme int au lieu de chaînes, vous pouvez le faire à la place

var pairs = (from Match m in Regex.Matches(data, "\"[0-9]\"\\,\"[0-9]\"") 
     select m.Value.Split(',')) 
     .ToDictionary(d => Int32.Parse(d[0].Replace("\"", "")), 
        d => Int32.Parse(d[1].Replace("\"", ""))); 
+0

Bonne solution RegEx mais la correspondance dépend des entiers d'un seul caractère. Les exemples de données de Yassir ne contiennent que des entiers à un seul caractère dans ce cas, mais cela peut ne pas être le cas pour toutes les exécutions de l'algorithme.Donc, la correspondance [0-9] doit être remplacée par un \ d (\ d = entiers n longueur) –

+0

D'accord, il peut être rendu plus flexible si besoin est avec des changements mineurs à la regex. –

+0

merci ça marche très bien :) –

2

Il y a 101 façons, mais voici une méthode parse string .Net 2.0:

 Dictionary<int, int> jsonValues = new Dictionary<int, int>(); 

     string data = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]"; 

     string[] items = data.Split(new string[]{"\"],[\""}, StringSplitOptions.RemoveEmptyEntries); 

     foreach (string str in items) 
     { 
      string[] intVals = str 
       .Replace("\"", "") 
       .Replace("[", "") 
       .Replace("[", "") 
       .Replace("]", "").Split(','); 

      jsonValues.Add(int.Parse(intVals[0]), int.Parse(intVals[1])); 
     } 

     // test print: 
     foreach (KeyValuePair<int,int> kvp in jsonValues) 
     { 
      System.Diagnostics.Debug.WriteLine(
       "ID:" + kvp.Key + " val:" + kvp.Value); 
     } 

par la voie. Puisque vous extrayez des paires de valeurs de noms, j'ai juste utilisé un dictionnaire de int/int pour contenir les données.

+0

Ça a l'air bien :) thx –

+0

De rien. Si vous voulez un algorithme plus serré ou peut-être plus rapide je recommanderais d'utiliser RegEx et correspondant pour les groupes de ", ". Mais ce n'est pas quelque chose que je peux frapper très rapidement. –

+0

thx beaucoup, mais avec RegEx je vais avoir quelque chose d'autre à se vanter !! –

0

Dans Silverlight, il y a System.Json.dll qui rend l'analyse JSON très facile. Il a été question de l'intégrer dans .NET4.0, mais je ne sais pas si c'est arrivé.

En .NET standard, vous pouvez utiliser DataContractJsonSerializer (utilisez quelque chose comme List> comme "type"). Cela fonctionne dans .NET3.0 et au-dessus. Peut ne pas être le meilleur choix pour tous les scénarios d'analyse JSON (mais fonctionnera pour le vôtre).

1

une réponse très littérale. Ne fonctionnera que pour le format exact que vous avez spécifié, peut aller un peu hawwire si vous transmettez des données inattendues. Renvoie un KeyValuepair avec chaque paire dedans.

 var val = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]"; 

     var result = val.ToCharArray() 
      .Where(itm => Char.IsDigit(itm)) 
      .Select((itm, index) => new {c = int.Parse(itm.ToString()),index = index + 1}) 
      .GroupBy(itm => itm.index % 2 == 0 ? itm.index - 1 : itm.index) 
      .Select(itm => new KeyValuePair<int, int>(itm.ElementAt(0).c, itm.ElementAt(1).c)); 
5

Nécessite la référence à l'ensemble System.Web.Extensions;

using System.Linq; 
using System.Collections; 
using System.Collections.Generic; 
using System.Web.Script.Serialization; 

class Program 
{ 
    public class Test 
    { 
     public string Id { get; set; } 
     public string Answer { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     string data ="[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"]]"; 
     List<Test> tests = 
      Array.ConvertAll<ArrayList, Test>(
       new JavaScriptSerializer() 
        .Deserialize<ArrayList>(data) 
         .OfType<ArrayList>().ToArray(), 
       (item) => 
       { 
        return new Test() 
        { 
         Id = (string)item[0], 
         Answer = (string) item[1] 
        }; 
       }).ToList(); 
    } 
} 

ROFL, HTH

1

Je pense que la façon easyiest à l'emploi est le morceau de code suivant:

using System.Collections.Generic; 
using System.IO; 
using System.Runtime.Serialization.Json; 
using System.Text; 

namespace JsonParser 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string data = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]"; 
      var stream = new MemoryStream(new ASCIIEncoding().GetBytes(data)); 
      var deserializer = new DataContractJsonSerializer(typeof(List<List<string>>)); 
      var result = (List<List<string>>)deserializer.ReadObject(stream); 
     } 
    } 
} 

du résultat du cours contient une "liste>" qui est le type correct de votre chaîne JSON. Aussi, vous devez vous rappeler d'ajouter des références aux DLLs suivantes:

  • System.Runtime.Serialization
  • System.ServiceModel.Web
Questions connexes