簡體   English   中英

在C#中從JSON提取變量數據

[英]Extracting variable data from JSON in C#

我有以下JSON,我需要將其處理為不同的JSON格式,以供其他進程使用。 我的數據在某種程度上是可變的。 這是一個例子:

{
    "subform_12": {
        "multiline_2": "Subform 1 Long Text",
        "listpicker_5": "High",
        "alpha_1": "SubForm 1 Text"
    },
    "subform_13": {
        "multiline_2": "Subform 2 Long Text",
        "alpha_1": "SubForm 2 Text"
    }
}

可變部分是json對象的名稱(例如“ subform_13”)以及每個對象的名稱對的數量和內容(例如“ multiline_2”:“ Subform 1 Long Text”)。

我需要做的是將每個節點轉換為自己的json塊,格式如下:

{
    "subform_13": [
        [{
                "fieldKey": "multiline_2",
                "value": "Subform 2 Long Text"
            },
            {
                "fieldKey": "alpha_1",
                "value": "SubForm 2 Text"
            }
        ]
    ]
}

然后分別:

    {
    "subform_13": [
        [{
                "fieldKey": "multiline_2",
                "value": "Subform 2 Long Text"
            },
            {
                "fieldKey": "alpha_1",
                "value": "SubForm 2 Text"
            }
        ]
    ]
}

到目前為止,我看到可以遍歷列表,如下所示:

     var json = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(
            jsonString,
            new Newtonsoft.Json.JsonSerializerSettings()
            {
                DateParseHandling = Newtonsoft.Json.DateParseHandling.None,
            });

    foreach (var item in json)
    {
       // I can see the "subform_13" and contents here in item , how do I generically extract them?
    }

任何幫助表示贊賞。

這是您的Main方法,具有迭代所有值的能力:

    static void Main(string[] args)
    {
        var json = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string,JObject>>(
            jsonString,
            new Newtonsoft.Json.JsonSerializerSettings()
            {
                DateParseHandling = Newtonsoft.Json.DateParseHandling.None,
            });
        foreach (var item in json)
        {
            var key = item.Key; // "subform_12"
            var val = item.Value;
            Console.WriteLine(key+":");
            foreach (var field in val)
            {
                var fieldKey = field.Key; // e.g. "multiline_2"
                var fieldVal = field.Value; // e.g. "Subform 1 Long Text"

                Console.WriteLine($"{fieldKey}={fieldVal.Value<string>()}");                    
            }
            Console.WriteLine();
        }
    }

我只是打印出值; 您將使用這些值構造新對象(例如, dynamic對象)。

我的Main的輸出是:

subform_12:
multiline_2=Subform 1 Long Text
listpicker_5=High
alpha_1=SubForm 1 Text

subform_13:
multiline_2=Subform 2 Long Text
alpha_1=SubForm 2 Text

希望能幫助到你。

可能有使用linq的更優雅的方法,但是這里的代碼使用了System.Web.Extensions中簡單的舊JavaScriptSerializer。

有一個結果字典,如果希望每個對象都分開,則可能不需要。

每個對象的json字符串存儲在allJson列表中。

類似地,如果您想要字典對象本身,則可以在每次迭代期間將分隔符添加到列表中。

        string s = "{\"subform_12\":{\"multiline_2\":\"Subform 1 Long Text\",\"listpicker_5\":\"High\",\"alpha_1\":\"SubForm 1 Text\"},\"subform_13\":{\"multiline_2\":\"Subform 2 Long Text\",\"alpha_1\":\"SubForm 2 Text\"}}";
        JavaScriptSerializer ser = new JavaScriptSerializer();
        Dictionary<string, object> obj = ser.DeserializeObject(s) as Dictionary<string, object>;

        // combined dictionary of all results
        Dictionary<string, object> result = new Dictionary<string, object>();
        // an intermediary dictionary to house the results of each object
        Dictionary<string, object> separated = new Dictionary<string, object>();

        // a list to hold the json representation of each separate object
        List<String> allJson = new List<string>();
        foreach (KeyValuePair<string, object> src in obj)
        {
            Dictionary<string, object> children = (Dictionary<string, object>)src.Value;
            Dictionary<string, object> t = new Dictionary<string, object>();
            separated = new Dictionary<string, object>();
            List<object> l = new List<object>();
            foreach (KeyValuePair<string, object> child in children)
            {
                t.Add("fieldKey", child.Key);
                t.Add("value", child.Value);
                l.Add(t);
                t = new Dictionary<string, object>();
            }
            separated.Add(src.Key, l.ToArray());
            allJson.Add(ser.Serialize(separated));
            result.Add(src.Key, l.ToArray());
        }

        // final string containing all transformed objects combined.            
        string combined = ser.Serialize(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM