因为我收到错误,无法反序列化json字符串

时间:2017-01-06 06:24:42

标签: c# json serialization

我有以下代码

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}]\"}"

在desierialize行上我得到以下错误

  

{“无法将当前JSON对象(例如{\”name \“:\”value \“})反序列化为类型'System.Collections.Generic.List`1 [WFAPlayers.Player]',因为类型需要要正确反序列化的JSON数组(例如[1,2,3])。\ r \ n要修复此错误要么将JSON更改为JSON数组(例如[1,2,3]),要么更改反序列化类型以便它是一个普通的.NET类型(例如,不是像整数这样的基本类型,不是类似于数组或List的集合类型),可以从JSON对象反序列化.JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。\ r \ nPath'GetPlayerInfoResult',第1行,第23位。“}

任何想法如何解决这个问题。

由于

2 个答案:

答案 0 :(得分:0)

您可以尝试使用此

 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;

答案 1 :(得分:0)

可以有两种方法来处理这种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);