JSON根据参数获取列表的值

时间:2018-10-14 01:20:35

标签: c# json linq

我必须处理一个复杂的JSON文件,但是遇到了一些障碍。

在下面,您会从XML类别中找到一些摘录,但我将其转换为JSON,以便能够更轻松地对其进行处理。

<Selection Category="M43002NN">
                            <ReferendumOptionIdentifier>foo</ReferendumOptionIdentifier>
                            <ValidVotes>6162</ValidVotes>
                            <CountMetric Id="M" Type="LevelDepositList">43002</CountMetric> 
                            <CountMetric Id="S4" Type="SeatsToBeFilled">23</CountMetric>    
                            <CountMetric Id="S5" Type="SubstitutesMax">0</CountMetric>      
                            <CountMetric Id="S9" Type="LinguisticRegime">2</CountMetric>                            
                            <CountMetric Id="S10" Type="VotesDeposited">6620</CountMetric>
                            <CountMetric Id="S11" Type="BlankAndInvalidVotes">458</CountMetric>
                            <CountMetric Id="S12" Type="Alderman">0</CountMetric>
                            <CountMetric Id="S14" Type="ValidVote_E5">0</CountMetric>
                            <CountMetric Id="S15" Type="BlankAndInvalidVotes_E5">0</CountMetric>    

                        </Selection>

在上面的示例中,我试图提取类型为“ SeatsToBeFilled”的CountMetric的值。

到目前为止,我已经能够收集结果并隔离正确的CountMetric,但是我似乎无法获得它的价值。

这是我的课程:

public class TotalSelectionClass
        {
            [JsonProperty("@Category")]
            public string Category { get; set; }
            public int ValidVotes { get; set; }
            public List<CountMetricClass> CountMetric { get; set; }
        }

这是我使用的CountMetricClass:

public class CountMetricClass
        {
            [JsonProperty("@Id")]
            public string Id { get; set; }

            [JsonProperty("@Type")]
            public string Type { get; set; }   

        }

下面是我用来获取所需CountMetric的代码(出于可读性目的而略微减少的代码):

var TotalSeats = Selection[0].CountMetric.Where(x => x.Type == "SeatsToBeFilled").First();

这将CountMetric对象返回给我,但是如何从中提取值?那么在这种情况下,如何从中提取数字23?

谢谢。

2 个答案:

答案 0 :(得分:0)

这里的答案实际上取决于JSON的形状,因此取决于您的XML-> JSON转换方式。您尚未提供JSON表单,也未寻求转换XML-> JSON的帮助,因此我将根据可用信息进行回答。

照原样,您无法从CountMetricClass获取CountMetric值。这是因为XML中保存的值(SeatsToBeFilled的值为23)永远不会读入该对象。要获得价值,您需要

1)检查您的XML转换器是否确实将XML中的值编码为要解析的JSON

2)修改CountMetricClass,以使其从此值字段读取。为了便于阅读,我选择将此字段称为MetricValue,但是显然您可以选择最适合您的名称。例如,您的新课程可能采用以下形式:

public class CountMetricClass
    {
        [JsonProperty("@Id")]
        public string Id { get; set; }

        [JsonProperty("@Type")]
        public string Type { get; set; }   

        [JsonProperty("@MetricValue")]
        public int MetricValue { get; set; }
    }

3)一旦成功将MetricValue读入您的CountMetricClass中,我们就可以修改linq表达式以通过访问目标CountMetric的MetricValue字段来获取值,例如:

var TotalSeats = Selection[0].CountMetric.Where(x => x.Type == "SeatsToBeFilled").MetricValue;

答案 1 :(得分:0)

对可能遇到相同问题的人进行一些后续跟踪。

根据SIRHAMY的建议,我看了一下从XML转换的实际JSON。

{"@Id":"S4","@Type":"SeatsToBeFilled","#text":"23"}

按照SIRHAMY的建议,我在CountMetricClass中创建了一个文本字段

public class CountMetricClass
        {
            [JsonProperty("@Id")]
            public string Id { get; set; }

            [JsonProperty("@Type")]
            public string Type { get; set; }

            [JsonProperty("#Text")]
            public string Text { get; set; }
        }

在那之后,我可以使用以下方法获取文本的值:

Selection[0].CountMetric.Where(x => x.Type == "SeatsToBeFilled").First().Text

这将给我返回“ 23”。

谢谢西里米!