2017-10-12 110 views
0

首先,對長文章/問題表示歉意。但是我非常沮喪,因爲我無法解決這個問題。從文件中反序列化JSON

我有一個JSON文件,我需要將其轉換爲可讀格式以存儲在數據庫中。要開始,我需要從文件中讀取日期。

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

我的文件中的數據是這樣的:

{ 
"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 
} 

在那之後,我轉換使用https://quicktype.io/我的JSON到了一個C#類:

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

從這裏,我我堅持如何處理我在myTextFile中讀取的數據..無法弄清楚如何以表格結構或任何其他可讀格式獲取數據,這些數據我可以在晚些時候執行其他操作r on。

+5

我不清楚什麼被問。當您嘗試反序列化生成的C#類時會發生什麼?我假設你使用'Newtonsoft'庫進行反序列化? – DiskJunky

+1

你應該也許不會讀你的文件到一個字符串數組。你需要將它們拼接在一起(大概都是?)Json解析器工作。改用'ReadAllText'。那麼你有一個你的整個文件的單個字符串,而不是代表每行的1到n個字符串。 – Skintkingle

+0

@Skintkingle好吧,我可以創建一個刺痛,之後,我該如何反序列化它?這是我的主要擔心。如果我可以反序列化爲CSV格式或標準文本,我將能夠處理它 – sikas

回答

1

不需要對長篇發表道歉。發佈你的代碼總是很好的:)

我認爲你需要看看更高級別的任務列表,而不是潛入你的實現中。

此致步驟應該如下:

  1. 創建符合JSON在C#中的對象(或任何你正在使用的語言)(看起來你已經有這個)
  2. 解析您的JSON和將結果存儲在C#對象的實例中。我沒有親自使用這個庫,但JSON.Net似乎是一個不錯的選擇。
  3. 在您的類中創建一個將對象存儲在數據庫中的方法,稱爲類似upload()的方法。
  4. 對新對象執行upload()方法。

另外請記住,您將需要選擇一個數據庫和設置/配置。您可以在本地機器上使用許多開發工具。我也沒有親自使用過,但SQL表達式似乎是C#的不錯選擇。一些谷歌搜索應該幫助你弄清楚如何做到這一點。

+0

非常感謝!我使用JSON.Net,但我的問題是我迷路了,無法弄清楚如何實際使用它..它包含在我的項目中,但缺少將JSON轉換爲CSV或任何其他格式的語法,無法弄清楚 – sikas

+0

至於數據庫,我已經處理過很多次..這是沒有問題的。我的主要問題是反序列化JSON文件 – sikas

+0

好吧。你可能會發布你試圖反序列化JSON的代碼嗎?即使這只是一次嘗試,也會讓你更容易給予建設性的反饋。 – nmg49

1

正如您在某些註釋中指定的那樣,您使用的是JSON.Net,並且您有一個類似於JSON文件結構的類。你從QuickType生成的代碼給了你(看起來是什麼)你需要的一切。 ,你有機會獲得一個字符串爲您的整個文件,你應該調用下面:然後

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

myObject將是QuickType生成的類的實例。然後你可以用這個對象來做任何你喜歡的事情(包括將它傳遞到你的數據訪問代碼中進行數據庫存儲)

這對我來說看起來不是什麼大問題。 QuickType看起來像它生成的一切你需要使用Json.Net

+0

謝謝,但問題仍然是如何反序列化?我無法弄清楚這一點,並且谷歌搜索沒有給予任何支持。 – sikas

+1

'GettingStarted.FromJson(myString);'是在'GettingStarted'類中生成的一個靜態方法,它是IN方法,你甚至看過代碼是爲你生成的嗎? 'JsonConvert.DeserializeObject (json,Converter.Settings);'將給定的'json'字符串反序列化爲'GettingStarted'對象,並返回它? – Skintkingle