JSON反序列化对象

时间:2015-04-02 07:30:26

标签: c# json deserialization

我遇到了JSON反序列化对象的问题。我得到了这个json:

{
    "status": "ok",
    "message": "OK",
    "clientData": {
        "id": 1,
        "properties": {
            "imie": "xxx",
            "nazwisko": "xxxx",
            "tel": "5121211",
            "email": "woeee@wwww",
            "pesel": "1111111",
            "kod_pocztowy": "2222",
            "miejscowosc": "eeee",
            "kwota_wnioskowana": 1,
            "dochod": 11,
            "bik": null,
            "firma_nip": "1",
            "komornik": null,
            "oddluzanie": null,
            "leadID": "I1"
        },
        "subcategories": {
            "67": 2001,
            "69": 2003
        }
    },
    "linksData": {
        "3": {
            "linkId": 574,
            "link": "ddd",
            "kartaPryw": 1,
            "produktNazwa": "xxx",
            "alternatives": {
                "114": {
                    "linkId": 114,
                    "link": "xxx",
                    "kartaPryw": 1
                },
                "513": {
                    "linkId": 513,
                    "link": "xxx",
                    "kartaPryw": 1
                },
                "532": {
                    "linkId": 532,
                    "link": "xxx",
                    "kartaPryw": 1
                }
            }
        },
        "12": {
            "linkId": 33,
            "link": "wwww",
            "kartaPryw": 0,
            "produktNazwa": "ee",
            "alternatives": {
                "38": {
                    "linkId": 38,
                    "link": "wwww",
                    "kartaPryw": 0
                },
                "40": {
                    "linkId": 40,
                    "link": "qqqq",
                    "kartaPryw": 0
                },
                "665": {
                    "linkId": 665,
                    "link": "wwww",
                    "kartaPryw": 0
                }
            }
        },
        "14": {
            "linkId": 116,
            "link": "ww",
            "kartaPryw": 0,
            "produktNazwa": "w",
            "alternatives": {
                "123": {
                    "linkId": 123,
                    "link": "ffff",
                    "kartaPryw": 0
                },
                "124": {
                    "linkId": 124,
                    "link": "ffff",
                    "kartaPryw": 0
                },
                "517": {
                    "linkId": 517,
                    "link": "wwww",
                    "kartaPryw": 0
                },
                "519": {
                    "linkId": 519,
                    "link": "ffff",
                    "kartaPryw": 0
                }
            }
        },
        "17": {
            "linkId": 404,
            "link": "ffff",
            "kartaPryw": 0,
            "produktNazwa": "ee",
            "alternatives": []
        },
        "26": {
            "linkId": 135,
            "link": "eeee",
            "kartaPryw": 0,
            "produktNazwa": "eee",
            "alternatives": []
        },
        "27": {
            "linkId": 790,
            "link": "eeee",
            "kartaPryw": 0,
            "produktNazwa": "ee",
            "alternatives": {
                "792": {
                    "linkId": 792,
                    "link": "eeeee",
                    "kartaPryw": 0
                }
            }
        },
        "34": {
            "linkId": 778,
            "link": "eee",
            "kartaPryw": 0,
            "produktNazwa": "eee",
            "alternatives": []
        }
    },
    "currentCartNr": 1
}

格式很糟糕,所以请在此处粘贴此代码以便更好地查看:http://json.parser.online.fr/

这是我的课程

public class Client
{
    public string Status { get; set; }
    public string Message { get; set; }
    public Data clientData { get; set; }
    public Dictionary<string, linksData> linksData;
    public int currentCartNr { get; set; }
}

public class Data
{
    public int id { get; set; }
    public Dictionary<string, string> properties { get; set; }
    public Dictionary<string, int> subcategories { get; set; }
}

public class linksData
{
    public int linkId { get; set; }
    public string link { get; set; }
    public int kartaPryw { get; set; }
    public string produktNazwa { get; set; }
    public Dictionary<string, alternatives> alternatives;
}


public class alternatives
{
    public int linkId { get; set; }
    public string link { get; set; }
    public int kartaPryw { get; set; }
}

我无法反序列化我的JSON,当我尝试反序列化&#34;替代品&#34;时,我会收到错误。如果我对此public Dictionary<string, alternatives> alternatives;发表评论,但我需要此字段。它有什么问题?

这就是我反序列化的方式:

var myObject = JsonConvert.DeserializeObject<Client>(get_person);

错误讯息:

无法将当前JSON数组(例如[1,2,3])反序列化为类型System.Collections.Generic.Dictionary`2 [System.String,Linker.Class.alternatives]&#39;因为类型需要JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{&#34; name&#34;:&#34; value&#34;})或将反序列化类型更改为实现集合接口的数组或类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。

更新

问题解决了。 alternative []被更改为null null并且有效。

2 个答案:

答案 0 :(得分:2)

这似乎是你的JSON上的问题(我想说)。 当替代品包含数据时,它是可以的(它将被序列化为字典)但是当它为空时,它会显示:

"alternatives": []

我认为您必须配置解析器,否则将失败。至少在Jackson for Java中这是可配置的。你使用哪一个?我想它也可以配置(也许是Json.NET?)

答案 1 :(得分:1)

我可以看到的问题是你的序列化而不是反序列化。 通过将空值序列化为字典,您不能稍后对其进行反序列化 问题是你从哪里得到你的JSON文件,你是谁在序列化它?如果是这样,您只需要将序列化更改为

var jsonText=JsonConvert.serialize(JsonObject, new JsonSerializerSettings() {NullValueHandling= NullValueHandling.Ignore });

反序列化与您在代码中所做的相同