【问题标题】:Get the pivot on the property name and list the property value获取属性名称的枢轴并列出属性值
【发布时间】:2018-06-21 16:57:28
【问题描述】:

给定 JSON 格式的数据:

[
        {
                "section": "charges",
                "lines": [
                        {
                                "cardtype": "MasterCard"
                        },
                        {
                                "sales": "$16.55"
                        },
                        {
                                "items": "10"
                        },
                        {
                                "cardtype": "Visa"
                        },
                        {
                                "sales": "$16.50"
                        },
                        {
                                "items": "39"
                        },
                        {
                                "cardtype": "Diners"
                        },
                        {
                                "sales": "40.00"
                        },
                        {
                                "items": "10"
                        }
                ]
        }
]

我想以属性名称为中心并列出属性值——也许在 DataTable 中?

数据收集为Dictionary<string,object>()

我需要按卡片类型汇总销售额和商品计数。例如:

+---------------+-------+-------+ | cardtype | sales | items | +---------------+-------+-------+ | Mastercard | 16.55 | 10 | | Visa | 16.50 | 39 | | Diners | 40.00 | 10 | +---------------+-------+-------+ | Total | 73.05 | 59 | <- would be calculated after conversion. +---------------+-------+-------+

我已经测试了SelectTokens() 方法,我可以提取行数组,但事实证明,旋转很困难,因为字段名称会根据数据来源的不同而有所不同。

有什么想法吗?

【问题讨论】:

  • 代码试用
  • JObject jo = JObject.Parse(json); jo.SelectToken("lines[0]") 将只返回第一条记录和值作为 JObject 和 JProperty 我试图迭代所有属性并将它们添加到新 IDictionary
  • 这里还有一些代码var r = jo.SelectToken("lines"); foreach( JToken item in r ) { foreach(JProperty prop in item ) { Console.WriteLine(item[prop.Name]); } }

标签: c# json json.net pivot pivot-table


【解决方案1】:

试试下面的代码

var files = JArray.Parse(JSON);
var recList = files.SelectToken("$..lines");
var str = JsonConvert.SerializeObject(recList);
var regex = new System.Text.RegularExpressions.Regex(@"(\{[^}]+)\},\{([^}]+)\},\{([^}]+)\}");
var output = regex.Replace(str, "$1, $2, $3 }");
System.Data.DataTable dt = (System.Data.DataTable)JsonConvert.DeserializeObject(str, (typeof(System.Data.DataTable)));

【讨论】:

  • 感谢您的评论。我对此进行了测试,问题是我得到了一堆空值,因为每个元素都是一个标记。我在数据表中得到参差不齐的数据。
  • 更新的答案,我认为那是因为我们在 json 上有额外的大括号
  • 可能需要一个正则表达式来删除那些额外的大括号
  • 对——这就是问题所在。 “万事达卡”、“$16.55”和“10”必须在一行。这就是挑战。
  • 适合使用正则表达式。有趣的解决方案!
猜你喜欢
  • 2014-06-27
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2018-11-16
  • 1970-01-01
  • 2017-08-18
  • 2023-03-07
相关资源
最近更新 更多