如何使用JSON数组中的相同键连接值

时间:2019-07-12 12:06:30

标签: c# json json.net

我正在一个项目中,我想从JSON数组构建令牌。

<DatePicker className="turkish"
                  locale={tr}
                  placeholderText="Please select a date"
                  onChange={this.handleChangeDatePicker}
                  onChangeRaw={this.handleDateChangeRaw}
                  selected={bookTime.data }

                  showTimeSelect
                  minTime={setHours(setMinutes(new Date(), 0), 7)}
                  maxTime={setHours(setMinutes(new Date(), 0), 22)}
                  minDate={subDays(new Date(), 0)}

                  timeFormat="HH:mm"
                  timeIntervals={60}
                  dateFormat="HH:mm,d MMMM yyyy"
                  timeCaption="Saat"

                />

以上代码成功创建了令牌$ Fruits。 但我也想实现令牌$ Number和$ Name,其中每个令牌的值来自同一键的串联值。例如,如果我使用“ $ Number”,它将被替换为111、112、113;如果我使用了“ $ Name”,它将被替换为Apple,Orange,Peach。

此外,我不使用任何强类型模型,因为我不知道什么数据将被馈送到系统。

有帮助吗?

1 个答案:

答案 0 :(得分:0)

为实现此目的,对代码进行了一些小的更改。首先让您的字典看起来像这样:

var customTokens = new Dictionary<string, List<string>>();

然后,当您遍历数组中的所有属性时,请检查是否已添加该属性,如果尚未添加,请检查。

foreach (JProperty prop in content.Properties())
{
    if(customTokens.ContainsKey(prop.Name))
    {
        customTokens[prop.Name].Add(prop.Value.ToString());
    }
    else
    {
        customTokens.Add(prop.Name, new List<string> { prop.Value.ToString() });
    }
}

最后,您有一本字典,其中的键是属性名称,值是List<string>-可以串联在一起:

foreach(var item in customTokens)
{
    Console.WriteLine(item.Key + ":" + String.Join(",", item.Value));
}

或者,如果您真的想要在串联字符串字典中使用它,只需

var finalResult = customTokens.ToDictionary(k => k.Key, v => String.Format(",",v.Value));

请注意,您需要在文件顶部添加using System.Linq才能使用ToDictionary

最终测试代码:

var result = "{ \"Fruits\":[{\"Number\":\"111\", \"Name\":\"Apple\"}, {\"Number\":\"112\", \"Name\":\"Orange\"},{\"Number\":\"113\", \"Name\":\"Peach\"}]}";
Dictionary<string, dynamic> data = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(result);
var customTokens = new Dictionary<string, List<string>>();
foreach (var dataField in data)
{
    if (dataField.Value is JArray)
    {         
        foreach (JObject content in dataField.Value.Children<JObject>())
        {
            foreach (JProperty prop in content.Properties())
            {
                if(customTokens.ContainsKey(prop.Name))
                {
                    customTokens[prop.Name].Add(prop.Value.ToString());
                }
                else
                {
                    customTokens.Add(prop.Name, new List<string> { prop.Value.ToString() });
                }
            }

        }

        foreach(var item in customTokens)
        {
            Console.WriteLine(item.Key + ":" + String.Join(",", item.Value));
        }
    }
}