【问题标题】:Complex json deserialization复杂的json反序列化
【发布时间】:2025-12-22 13:50:11
【问题描述】:

我必须反序列化以下 json 响应(Result 列表长度可变):

{
    "ResultSet": {
        "Query": "volkswagen",
        "Result": [
            {
                "symbol": "VLKAY",
                "name": "Volkswagen AG",
                "exch": "PNK",
                "type": "S",
                "exchDisp": "OTC Markets",
                "typeDisp": "Equity"
            },
            {
                "symbol": "VOW3.DE",
                "name": "Volkswagen AG",
                "exch": "GER",
                "type": "S",
                "exchDisp": "XETRA",
                "typeDisp": "Equity"
            },
            {
                "symbol": "VOW.DE",
                "name": "Volkswagen AG",
                "exch": "GER",
                "type": "S",
                "exchDisp": "XETRA",
                "typeDisp": "Equity"
            }
        ]
    }
}

我得到了什么:

JavaScriptSerializer js = new JavaScriptSerializer();
string jsonString = "...String is here...";
SearchObj obj = js.Deserialize<SearchObj>(jsonString);

我知道我通常必须创建一个合适的 obj。例如SearchObj 将被填充,但在这种情况下,我不完全确定这个对象应该是什么样子。我想出了:

class Data 
{
    public string symbol { get; set; }
    public string name { get; set; }
    public string exch { get; set; }
    public string type { get; set; }
    public string exchDisp { get; set; }
    public string typeDisp { get; set; }
}

class Container 
{
    public string Query { get; set; }
    public List<Data> Result { get; set; }
}

class SearchObj
{
    public Container ResultSet { get; set; }
}

但是你猜怎么着,它不起作用,我只得到ResultSet = null

【问题讨论】:

  • 您是否收到解析错误/异常?
  • 何不来看看动态,*.com/questions/3142495/…
  • @phoenix7360 没有错误/异常。理查德,我会调查的。
  • 对象没有被填充吗?某些属性是否被填充?
  • 我测试了你的代码,它可以工作:resultset=3

标签: c# json


【解决方案1】:

尝试将您的类 Container 更改为

 class Container 
 {
     public string Query { get; set; }
     public Data[] Result { get; set; }
 } 

根据我的观察,我还没有测试过

【讨论】:

    【解决方案2】:

    当我回答自己的问题时,我总是感觉很糟糕,但是就这样吧。

    基本上我的想法是正确的,我只犯了一个错误,那就是我不需要

    class SearchObj
    {
        public Container ResultSet { get; set; }
    }
    

    使用

    Container obj = js.Deserialize<Container>(jsonString);
    

    而不是

    SearchObj obj = js.Deserialize<SearchObj>(jsonString);
    

    成功了。顺便说一句,容器中的 Data[]List&lt;Data&gt; 都可以工作。

    编辑: 从 giammins 的评论看来,它似乎在一些没有这种变化的机器上工作,但我想这是未定义行为的情况。

    【讨论】:

    • 根据您的示例 JSON,拥有外部对象更正确...奇怪。
    【解决方案3】:

    您可以使用http://www.json2charp.com 来创建您的课程。

    【讨论】:

      最近更新 更多