【问题标题】:LINQ on polymorphic json to get a comma separated field多态 json 上的 LINQ 以获取逗号分隔的字段
【发布时间】:2016-11-08 17:40:20
【问题描述】:

我有一个多态的 json 字符串。这是它的样子:

{
    "?xml" : {
        "@version" : "1.0",
        "@encoding" : "UTF-8"
    },
    "DataFeed" : {
        "@FeedName" : "complianceCompany",
        "Companies" : {
            "@timeStamp" : "2016-07-06T10:16:51.00",
            "Company" : [{
                    "@id" : "1",
                    "Ticker" : "MSFT-NSDQ",
                    "Name" : "Microsoft",
                    "Disclosure" : {
                        "@Code" : "25",
                        "@Description" : "25: PERSON FINANCIAL INTEREST"
                    }
                }, {
                    "@id" : "3",
                    "Ticker" : "AAPL-NSDQ",
                    "Name" : "Apple",
                    "Disclosure" : [{
                            "@Code" : "3",
                            "@Description" : "03: RECEIVED COMP FOR NON-IB SVS"
                        }, {
                            "@Code" : "6C",
                            "@Description" : "06C: CLIENT NON SEC REL SVS"
                        }, {
                            "@Code" : "39",
                            "@Description" : "39: MARKET MAKER"
                        }
                    ]
                }
            ]
        }
    }
}

曾经有人帮我做了以下扩展类:

public static class JsonExtensions
{
    public static IEnumerable<JObject> ObjectsOrSelf(this JToken root)
    {
        if (root is JObject)
            yield return (JObject)root;
        else if (root is JContainer)
            foreach (var item in ((JContainer)root).Children())
                foreach (var child in item.ObjectsOrSelf())
                    yield return child;
        else
            yield break;
    }
}

基于此,这是我的查询:

JObject feed = JObject.Parse(jsonText);

var discInfo = from issuer in feed.SelectTokens("DataFeed.Companies.Company").SelectMany(i => i.ObjectsOrSelf())
   let discs = issuer.SelectTokens("Disclosure").SelectMany(s => s.ObjectsOrSelf())
   select new
    {
        Id = (int)issuer["@id"],
        Ticker = (string)issuer["Ticker"],
        CompName = (string)issuer["Name"],
        DiscCode = (string)discs["@Code"],
    };

当我尝试查询时,我收到以下错误:

Cannot apply indexing with [] to an expression of type 'IEnumerable<JObject>'

我正在尝试将所有光盘放在一个逗号分隔的字段中,用于每个股票代码。最终结果应如下所示:

我怎样才能得到最终结果?

【问题讨论】:

  • 看看错误在说什么。我没有详细阅读代码,但是使用 [] 进行索引显然不是访问IEnumerable 元素的正确方法。你应该考虑使用IEnumerable.ElementAt()
  • 但这只会给我 1 个元素。如果有 1 个或多个(用逗号分隔),我想要所有 DiscCode 元素。

标签: c# c#-4.0 json.net linq-to-json


【解决方案1】:

当你这样做时......

DiscCode = (string)discs["@Code"]

...您正在尝试访问披露JObject 的属性"@Code"。但是discs 的类型是IEnumerable&lt;JObject&gt;!您必须收集discs 中的所有"@Code"s 并将它们连接起来。

LINQ 的 Aggregate() 可以做到这一点,但我认为使用 string.Join() 看起来总是更易读:

DiscCode = string.Join(", ", discs.Select(d => (string)d["@Code"]))

【讨论】:

  • 如此简单,但非常有效。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多