在C#中从JSON中提取变量数据

时间:2017-06-30 23:01:17

标签: c# json

我有以下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?
    }

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

以下是您的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

希望它有所帮助。

答案 1 :(得分:0)

使用linq可能有更优雅的方法,但这里的代码使用System.Web.Extensions中的普通旧JavaScriptSerializer。

有一个结果字典,如果你希望每个对象分开,你可能不需要它。

每个对象的json字符串存储在allJson列表中。

类似地,如果您想要字典对象本身,您可以在每次迭代期间将分隔符添加到列表中。

<form name="reaction" method="post" action="./send1.php">
  <div class="col-md-12 xdisplay_inputx has-feedback">
    <input type="text" name="product1" id="product1" class="form-control has-feedback-left" aria-describedby="inputSuccess2Status4">
    <span class="fa fa-calendar-o form-control-feedback left" aria-hidden="true"></span>
    <span id="inputSuccess2Status4" class="sr-only">(success)</span>
  </div>

  <div class="col-md-12 xdisplay_inputx has-feedback">
    <input type="text" name="product2" id="product2" class="form-control has-feedback-left" aria-describedby="inputSuccess2Status4">
    <span class="fa fa-calendar-o form-control-feedback left" aria-hidden="true"></span>
    <span id="inputSuccess2Status4" class="sr-only">(success)</span>
  </div>

<button class="btn btn-block btn-success" name="save"><i class="fa fa-check"></i>  Send</button>
</form>