2017-10-12 16 views
0

Tout d'abord, présentez-vous des excuses pour le long article/la question. Mais je suis vraiment frustré car je ne peux pas résoudre ce problème.Désérialise JSON à partir du fichier

J'ai un fichier JSON que j'ai besoin de convertir en un format lisible pour stocker dans une base de données .. Pour commencer, j'ai besoin de lire la date du fichier.

Array myTextFile = File.ReadAllLines(@"C:\path\to\json\file.js"); 

Mes données dans le fichier ressemble à ceci:

{ 
"javaClass": "com.untangle.app.firewall.FirewallSettings", 
"rules": { 
    "javaClass": "java.util.LinkedList", 
    "list": [ 
     { 
      "block": true, 
      "conditions": { 
       "javaClass": "java.util.LinkedList", 
       "list": [ 
        { 
         "conditionType": "DST_ADDR", 
         "invert": false, 
         "javaClass": "com.untangle.app.firewall.FirewallRuleCondition", 
         "value": "Some String" 
        } 
       ] 
      }, 
      "description": "Suspecious Traffic", 
      "enabled": true, 
      "flag": true, 
      "javaClass": "com.untangle.app.firewall.FirewallRule", 
      "ruleId": 100001 
     }, 
     { 
      "block": false, 
      "conditions": { 
       "javaClass": "java.util.LinkedList", 
       "list": [] 
      }, 
      "description": "TMP ALLOW ALL", 
      "enabled": false, 
      "flag": false, 
      "javaClass": "com.untangle.app.firewall.FirewallRule", 
      "ruleId": 100002 
     }, 
     { 
      "block": false, 
      "conditions": { 
       "javaClass": "java.util.LinkedList", 
       "list": [ 
        { 
         "conditionType": "DST_PORT", 
         "invert": false, 
         "javaClass": "com.untangle.app.firewall.FirewallRuleCondition", 
         "value": "80,443,8080" 
        }, 
        { 
         "conditionType": "SRC_INTF", 
         "invert": false, 
         "javaClass": "com.untangle.app.firewall.FirewallRuleCondition", 
         "value": "non_wan" 
        } 
       ] 
      }, 
      "description": "Allow All HTTP(S)", 
      "enabled": true, 
      "flag": false, 
      "javaClass": "com.untangle.app.firewall.FirewallRule", 
      "ruleId": 100003 
     }, 
     { 
      "block": true, 
      "conditions": { 
       "javaClass": "java.util.LinkedList", 
       "list": [ 
        { 
         "conditionType": "DST_INTF", 
         "invert": false, 
         "javaClass": "com.untangle.app.firewall.FirewallRuleCondition", 
         "value": "wan" 
        }, 
        { 
         "conditionType": "SRC_INTF", 
         "invert": false, 
         "javaClass": "com.untangle.app.firewall.FirewallRuleCondition", 
         "value": "non_wan" 
        } 
       ] 
      }, 
      "description": "BLOCK ALL (RULEBASE END)", 
      "enabled": true, 
      "flag": true, 
      "javaClass": "com.untangle.app.firewall.FirewallRule", 
      "ruleId": 10004 
     } 
    ] 
}, 
"version": 1 
} 

Après cela, je me suis converti mon JSON en utilisant https://quicktype.io/ à une classe C# qui a donné:

// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do: 
// 
// using QuickType; 
// 
// var data = GettingStarted.FromJson(jsonString); 
// 
namespace QuickType 
{ 
    using System; 
    using System.Net; 
    using System.Collections.Generic; 

    using Newtonsoft.Json; 

    public partial class GettingStarted 
    { 
     [JsonProperty("rules")] 
     public Rules Rules { get; set; } 

     [JsonProperty("javaClass")] 
     public string JavaClass { get; set; } 

     [JsonProperty("version")] 
     public long Version { get; set; } 
    } 

    public partial class Rules 
    { 
     [JsonProperty("javaClass")] 
     public string JavaClass { get; set; } 

     [JsonProperty("list")] 
     public List[] List { get; set; } 
    } 

    public partial class List 
    { 
     [JsonProperty("enabled")] 
     public bool Enabled { get; set; } 

     [JsonProperty("conditions")] 
     public Conditions Conditions { get; set; } 

     [JsonProperty("block")] 
     public bool Block { get; set; } 

     [JsonProperty("description")] 
     public string Description { get; set; } 

     [JsonProperty("javaClass")] 
     public string JavaClass { get; set; } 

     [JsonProperty("flag")] 
     public bool Flag { get; set; } 

     [JsonProperty("ruleId")] 
     public long RuleId { get; set; } 
    } 

    public partial class Conditions 
    { 
     [JsonProperty("javaClass")] 
     public string JavaClass { get; set; } 

     [JsonProperty("list")] 
     public OtherList[] List { get; set; } 
    } 

    public partial class OtherList 
    { 
     [JsonProperty("invert")] 
     public bool Invert { get; set; } 

     [JsonProperty("conditionType")] 
     public string ConditionType { get; set; } 

     [JsonProperty("javaClass")] 
     public string JavaClass { get; set; } 

     [JsonProperty("value")] 
     public string Value { get; set; } 
    } 

    public partial class GettingStarted 
    { 
     public static GettingStarted FromJson(string json) => JsonConvert.DeserializeObject<GettingStarted>(json, Converter.Settings); 
    } 

    public static class Serialize 
    { 
     public static string ToJson(this GettingStarted self) => JsonConvert.SerializeObject(self, Converter.Settings); 
    } 

    public class Converter 
    { 
     public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings 
     { 
      MetadataPropertyHandling = MetadataPropertyHandling.Ignore, 
      DateParseHandling = DateParseHandling.None, 
     }; 
    } 
} 

A partir de là, je suis coincé sur la façon de traiter les données que j'ai lu dans myTextFile .. Impossible de comprendre comment obtenir les données dans une structure tabulaire ou tout autre format lisible que je peux effectuer d'autres opérations à la fin r on.

+5

Je ne comprends pas très bien ce qui est demandé. Que se passe-t-il lorsque vous essayez de désérialiser dans les classes C# générées? Je suppose que vous utilisez la bibliothèque 'Newtonsoft' pour désérialiser? – DiskJunky

+1

vous ne devriez probablement pas non plus lire votre fichier dans un tableau de chaînes. Vous allez devoir les assembler pour la plupart (probablement tous?) Json parseurs au travail. Utilisez 'ReadAllText' à la place. alors vous avez une seule chaîne de votre fichier entier au lieu de 1 à n chaînes représentant chaque ligne. – Skintkingle

+0

@Skintkingle Bon, je peux créer une piqûre, après ça, comment puis-je le désérialiser? C'est ma principale préoccupation .. Si je peux désérialiser au format CSV ou texte standard, je serai en mesure d'y faire face – sikas

Répondre

1

Pas besoin de vous excuser à propos d'un long message. Il est toujours bon de poster votre code :)

Je pense que vous devez regarder comme une liste de tâches de niveau supérieur au lieu de plonger dans votre implémentation.

Vôtre étapes devraient être les suivantes:

  1. Créer un objet en C# (ou quelle que soit la langue que vous utilisez) correspondant à votre JSON (il semble que vous avez déjà)
  2. Parse votre JSON et stocker le résultat dans une instance de votre objet C#. Je n'ai pas utilisé cette bibliothèque personnellement, mais JSON.Net semble être un bon choix.
  3. Créez une méthode dans votre classe qui stocke l'objet dans votre base de données, appelée quelque chose comme upload().
  4. Exécutez la méthode upload() sur votre nouvel objet.

Gardez également à l'esprit que vous devrez choisir une base de données et l'installer/configurer. Il y en a beaucoup que vous pouvez utiliser pour développer sur votre machine locale. Je n'ai pas utilisé cela personnellement, mais SQL Express semble être un bon choix pour C#. Certains googling devrait vous aider à comprendre comment faire cela.

+0

Merci beaucoup! J'utilise JSON.Net, mais mon problème est que je suis perdu et ne peux pas comprendre comment l'utiliser réellement .. Il est inclus dans mon projet, mais la syntaxe pour convertir le JSON en CSV ou tout autre format est manquant , ne peut pas le comprendre – sikas

+0

Quant à la DB, je l'ai déjà traité avant de nombreuses fois .. ce n'est pas un problème. Mon problème principal est de désérialiser le fichier JSON – sikas

+0

Okay. Pourriez-vous poster un code qui tente de désérialiser le JSON? Même si ce n'est qu'une tentative, il serait beaucoup plus facile de vous donner des commentaires constructifs. – nmg49

1

Comme vous l'avez spécifié dans certains commentaires, vous utilisez JSON.Net et vous avez une classe qui ressemble à la structure de votre fichier JSON. Votre code généré par QuickType vous a donné (ce qui semble être) tout ce dont vous avez besoin. où vous avez accès à une seule chaîne pour votre dossier complet, vous devez appeler les éléments suivants:

var myString = File.ReadAllText(@"C:\path\to\json\file.js"); 
var myObject = GettingStarted.FromJson(myString); 

myObject sera alors une instance de la classe générée par QuickType. vous pouvez alors faire ce que vous voulez avec cet objet (y compris le transférer dans votre code d'accès aux données pour le stockage de la base de données)

Cela ne me semble pas vraiment problématique. QuickType semble avoir généré tout ce dont vous avez besoin pour utiliser avec Json.Net

+0

Merci, mais la question est toujours, comment désérialiser? Je ne peux pas comprendre cela, et googling n'a pas donné de support – sikas

+1

'GettingStarted.FromJson (myString);' est généré comme une méthode statique sur la classe 'GettingStarted'.C'est IN dans cette méthode.Avez-vous même regardé le 'JsonConvert.DeserializeObject (json, Converter.Settings);' désérialise la chaîne 'json' donnée en objet' GettingStarted' et la renvoie? – Skintkingle