【问题标题】:JSON C# Parsing ErrorJSON C# 解析错误
【发布时间】:2014-06-17 05:55:26
【问题描述】:

这是我的 JSON

{
    "3659639": {
        "EventID": 3659639,
        "RaceNum": 2,
        "Meeting": "Newton Abbot",
        "RaceType": "T",
        "Description": "Attheraces.Com Handicap Chase",
        "Distance": "5300m",
        "TrackCondition": "Good",
        "Weather": "Overcast",
        "Abandoned": 0,
        "SuspendDateTime": "2014-06-17 00:00:42.0000000",
        "OutcomeDateTime": "2014-06-17 00:00:00.0000000",
        "EffectiveRaceDate": "2014-06-16",
        "Status": "Paying",
        "Results": [
            {
                "event_id": 3659639,
                "saddle_number": 11,
                "position": 1,
                "status": "Final"
            },
            {
                "event_id": 3659639,
                "saddle_number": 16,
                "position": 2,
                "status": "Final"
            },
            {
                "event_id": 3659639,
                "saddle_number": 17,
                "position": 3,
                "status": "Final"
            }
        ],
        "Dividends": {
            "0": {
                "event_id": 3659639,
                "source": "NSW",
                "pool_type": "Duet",
                "outcome": "11\/16",
                "pool_value": 79.5,
                "interim_dividend": 11.2,
                "final_dividend": 11.2
            },

            "36": {
                "event_id": 3659639,
                "source": "VIC",
                "pool_type": "Trifecta",
                "outcome": "11\/16\/17",
                "pool_value": 1733,
                "interim_dividend": 2746.2,
                "final_dividend": 2746.2
            },
            "37": {
                "event_id": 3659639,
                "source": "VIC",
                "pool_type": "Win",
                "outcome": "11",
                "pool_value": 2541.06,
                "interim_dividend": 25.5,
                "final_dividend": 25.5
            },
            "RunnerProducts": {
                "11": {
                    "TopeTotePlace": 12,
                    "MidTotePlace": 7.3,
                    "TopeToteWin": 29.8,
                    "MidToteWin": 28,
                    "BestOrSP": 29.8
                },
                "16": {
                    "TopeTotePlace": 2.3,
                    "MidTotePlace": 2
                },
                "17": {
                    "TopeTotePlace": 26.4,
                    "MidTotePlace": 24.2
                }
            }
        }
    },



    "3622800": {
        "EventID": 3622800,
        "RaceNum": 2,
        "Meeting": "Albion Park",
        "RaceType": "H",
        "Description": "Seymour Rising Stars Championship C0 Heat One",
        "Distance": "1660m",
        "TrackCondition": "Good",
        "Weather": "Fine",
        "Abandoned": 0,
        "SuspendDateTime": "2014-06-17 15:09:10.0000000",
        "OutcomeDateTime": "2014-06-17 15:08:00.0000000",
        "EffectiveRaceDate": "2014-06-17",
        "Status": "Closed",
        "Results": [

        ],
        "Dividends": {
            "RunnerProducts": [

            ]
        }
    },



    "3679673": {
        "EventID": 3679673,
        "RaceNum": 6,
        "Meeting": "Thirsk",
        "RaceType": "T",
        "Description": "Market Cross Jewellers Handicap",
        "Distance": "1200m",
        "TrackCondition": null,
        "Weather": null,
        "Abandoned": 0,
        "SuspendDateTime": "2014-06-18 02:20:00.0000000",
        "OutcomeDateTime": "2014-06-18 02:20:00.0000000",
        "EffectiveRaceDate": "2014-06-17",
        "Status": "Open",
        "Results": [

        ],
        "Dividends": {
            "RunnerProducts": [

            ]
        }
    }
}

我正在尝试使用 JSON.Net 解析此代码,并且我已尝试过此代码。

var obj = JObject.Parse(json);
var query =
    from JProperty ev in obj.AsJEnumerable()
    from JProperty evid in ev.Value.AsJEnumerable()
    let value = (JObject)evid.Value
    select new
    {
        Description = (string)value["Description"]

    };

我收到此错误“无法将'Newtonsoft.Json.Linq.JValue' 类型的对象转换为'Newtonsoft.Json.Linq.JObject'。”

我还想阅读结果和分红中的 event_id。谁能告诉我我在这里做错了什么

【问题讨论】:

  • 你真的认为你需要发布 384 行 JSON 来证明这一点吗?请更加努力地用最少组重现问题的数据和代码提出问题。
  • 对不起,先生,我已经编辑了我的代码,而我的原始 json 是数千。我试图减少一些代码行,但现在我已经减少了更多,谢谢
  • 仍然有超过 100 行 JSON。我怀疑您可以使用大约 20 行或更少的 JSON 轻松重现该问题。

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


【解决方案1】:

目前,您正在获取属性的属性 - 然后尝试将每个值转换为 JObject,然后采用 thatDescription。这太深了一层,就像你一样:

  • 根对象
  • 根对象的每个属性,真正有一个对象作为其值
  • 每个值的每个属性...其中大部分只是字符串属性,因此值不能转换为JObject

完全不清楚您为什么使用AsJEnumerable(),但您只需要根对象的属性,这些属性可以通过Properties() 方法轻松获得。同样,不清楚为什么要使用匿名类型,而不仅仅是获取字符串序列。这工作正常:

var query =
    from ev in obj.Properties()
    select (string) ev.Value["Description"];

或者没有查询语法:

var query = obj.Properties.Select(ev => (string) ev.Value["Description"]);

下一步:

我还想阅读结果和分红中的 event_id

在您提供的数据中,它始终与顶级类型中EventID 属性的值相同。所以你最好:

var query =
    from ev in obj.Properties()
    select new { Description = (string) ev.Value["Description"],
                 Id = (string) ev.Value["EventID"] };

如果您真的想获得红利和结果中的值,则需要弄清楚如何处理这些属性中的多个条目。

【讨论】:

  • 这里的用户似乎是这个问题的用户的延续:stackoverflow.com/questions/24254964/…。我觉得这里的代码非常熟悉。
  • 谢谢,我怎样才能获得结果和股息中的 event_id?
  • @user3747054:查看我的编辑 - 从每个事件的“主要”对象而不是结果和红利中的对象(顺便说一下,不是红利 - 如果你继续这样做的话)更容易打错了,如果你试图提取属性,你会遇到麻烦)。
  • 好吧,我需要其他项目,例如股息中的 final_dividend 和结果中的 saddle_number
  • @user3747054:现在你要改变问题了。当您在 Stack Overflow 上提出问题时,您应该提出 一个 问题并停在那里,而不是在进行过程中添加额外的要求。我已经解释了您收到该错误的原因,并帮助您获取了描述和事件 ID。如果您遇到其他问题,请自行解决,然后提出一个新问题(最好使用 更小的示例 JSON 文档和简短但 完整 程序) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多