【问题标题】:Cannot Deserialize json string as i get an error出现错误时无法反序列化 json 字符串
【发布时间】:2017-01-06 06:24:42
【问题描述】:

我有以下代码

string downloadString = client.DownloadString(serviceurl);
List<Player> myDeserializedObjList = (List<Player>)JsonConvert.DeserializeObject(downloadString, typeof(List<Player>));

调试代码时downloadString有如下值

"{\"GetPlayerInfoResult\":\"[{\\\"PlayerId\\\":1,\\\"FirstName\\\":\\\"Ryan\\\",\\\"LastName\\\":\\\"Richard\\\",\\\"Age\\\":30},{\\\"PlayerId\\\":2,\\\"FirstName\\\":\\\"Petrus\\\",\\\"LastName\\\":\\\"Prinsloo\\\",\\\"Age\\\":20}]\"}"

在反序列化行我收到以下错误

{"无法将当前 JSON 对象(例如 {\"name\":\"value\"})反序列化为类型 'System.Collections.Generic.List`1[WFAPlayers.Player]',因为该类型需要JSON 数组(例如 [1,2,3])以正确反序列化。\r\n要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其可以从 JSON 对象反序列化的普通 .NET 类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型)。也可以将 JsonObjectAttribute 添加到该类型以强制它从 JSON 对象反序列化.\r\n路径 'GetPlayerInfoResult',第 1 行,位置 23。"}

任何想法我可以解决这个问题。

谢谢

【问题讨论】:

    标签: c# json serialization


    【解决方案1】:

    可能有两种方法来处理这种 JSON 字符串。 JSON 字符串的问题在于它看起来像这样

    {
        "GetPlayerInfoResult": "[{\"PlayerId\":1,\"FirstName\":\"Ryan\",\"LastName\":\"Richard\",\"Age\":30},{\"PlayerId\":2,\"FirstName\":\"Petrus\",\"LastName\":\"Prinsloo\",\"Age\":20}]"
    }
    

    它应该看起来像

    {
        "GetPlayerInfoResult": [
            {
                "PlayerId": 1,
                "FirstName": "Ryan",
                "LastName": "Richard",
                "Age": 30
            },
            {
                "PlayerId": 2,
                "FirstName": "Petrus",
                "LastName": "Prinsloo",
                "Age": 20
            }
        ]
    }
    

    所以这似乎将GetPlayerInfoResult 作为一个字符串,所以我们可以纠正 JSON 字符串正确并像反序列化一样

    string jsonstr = File.ReadAllText(YourJSONFile);
    //remove the \ forward slash from the string 
    jsonstr = jsonstr.Replace("\\", "");
    //replace the "[ to [
    jsonstr = jsonstr.Replace("\"[", "[");
    //replace the ]" to ]
    jsonstr = jsonstr.Replace("]\"", "]");
    //now deseralize it normally like any other JSON String
    var ser = JsonConvert.DeserializeObject<GetPlayerInfo>(jsonstr);
    

    类结构如下所示

    public class GetPlayerInfoResult
    {
        public int PlayerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
    
    public class GetPlayerInfo
    {
        public List<GetPlayerInfoResult> GetPlayerInfoResult { get; set; }
    }
    

    首选/推荐方式

    我们也可以进行双重去序列化。我们不应该更改 JSON 字符串中的任何内容,无需替换任何内容并保持原样。

    public class GetPlayerInfo
    {
        public string GetPlayerInfoResult { get; set; }
    }
    public class GetPlayerInfo
    {
        public int PlayerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
    

    反序列化就像

    var ser = JsonConvert.DeserializeObject<GetPlayerInfo>(jsonstr);
    var ser1 = JsonConvert.DeserializeObject<List<PlayerInfoResult>>(ser.GetPlayerInfoResult);
    

    【讨论】:

    • 感谢所有帮助。您推荐的方式非常有效。 Mohit 任何机会你都可以帮助我解决我在另一个问题上遇到的另一个问题
    • 当然不是!只需粘贴另一个问题的链接,如果可能的话,我很想回答它
    • 在此表示感谢的另一种方式是支持答案。
    • 我尝试过,但我没有投票的权利。我认为赞成票是当您单击向上箭头时。
    • 是的! @RyanRichard 你是对的。单击向上箭头将投票。不用担心,您很快就会获得投票特权。 :)
    【解决方案2】:

    你可以试试这个

     List<Player> myDeserializedObjList =JsonConvert.DeserializeObject <IEnumerable<Player>>(downloadString).ToList();
    

    有些人发现使用IEnumerable 作为反序列化的类型会有所帮助。或者,您可以尝试像这样直接反序列化到列表中

     List<Player> myDeserializedObjList =JsonConvert.DeserializeObject <List<Player>>(downloadString);
    

    编辑:

    查看字符串,您似乎在 JSON 数组周围有一个容器对象,因此您需要一个可以反序列化数据的容器对象。

    public class Data
    {
         public List<PLayer> GetPlayerInfoResult { get; set; }
    }
    

    然后你会打电话

     List<Player> myDeserializedObjList =JsonConvert.DeserializeObject <Data>(downloadString).GetPlayerInfoResult;
    

    【讨论】:

    • 感谢您的回答。我已经试过这个并得到同样的错误。
    • 皮金顿。感谢你的回答。我现在收到以下错误 {"Error conversion value \"[{\"PlayerId\":1,\"FirstName\":\"Ryan\",\"LastName\":\"Richard\",\"Age \":30},{\"PlayerId\":2,\"FirstName\":\"Petrus\",\"LastName\":\"Prinsloo\",\"Age\":20}]\"键入'System.Collections.Generic.List`1[WFAPlayers.Player]'。路径'GetPlayerInfoResult',第1行,位置181。"}
    猜你喜欢
    • 2013-12-13
    • 2020-11-23
    • 2021-02-11
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多