我正在尝试使用Riot游戏REST API在C#中制作Web应用程序。 我可以使用 RESTSharp 发出请求,但在使用 JSON.Net 将返回的 Json 转换为对象时遇到了一些问题。 我的请求返回一个 JSON 字符串,例如:
{"dyrus":{"id":4136713,"name":"Dyrus","profileIconId":23,"summonerLevel":1,"revisionDate":1376908220000}}
我想将其反序列化为具有以下属性的对象:id
、name
、profileIconID
、summonerLevel
和revisionDate
。
我遇到的问题是信息被反序列化为字符串,因为字典是嵌套的。 检索字符串的嵌套字典部分的最佳方法是什么:{"id":4136713,"name":"Dyrus","profileIconId":23,"summonerLevel":1,"revisionDate":1376908220000}
并将其转换为对象?
感谢您的帮助!
编辑:
这是我尝试过的:
public class LeagueUser
{
public LeagueUser(string json)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonString = (string)serializer.DeserializeObject(json);
LeagueUser test = (LeagueUser)serializer.DeserializeObject(jsonString);
}
public int id { get; set; }
public string name { get; set; }
public long revisionDate { get; set; }
}
你不需要构造函数,LeagueUser
类更改为这个
public class LeagueUser
{
public int id { get; set; }
public string name { get; set; }
public long revisionDate { get; set; }
}
并使用 Json.NET 将 JSON 反序列化为Dictionary<string, LeagueUser>
string jsonStr = "{"dyrus":{"id":4136713,"name":"Dyrus","profileIconId":23,"summonerLevel":1,"revisionDate":1376908220000}}";
var deserializedObject = JsonConvert.DeserializeObject<Dictionary<string, LeagueUser>>(jsonStr);
您可以通过这种方式获取LeagueUser
对象
LeagueUser leagueUser = deserializedObject["dyrus"];
为LeagueUser
类创建自定义转换器来实现您想要的:
public class LeagueUserConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(LeagueUser) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (!CanConvert(objectType)) return null;
var jObject = JObject.Load(reader);
var user = new LeagueUser
{
Id = Convert.ToInt64(jObject["dyrus"]["id"]),
Name = jObject["dyrus"]["name"].ToString(),
ProfileIconId = Convert.ToInt32(jObject["dyrus"]["profileIconId"]),
SummonerLevel = Convert.ToInt32(jObject["dyrus"]["summonerLevel"]),
RevisionDate = Convert.ToInt64(jObject["dyrus"]["revisionDate"])
};
return user;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
接下来,您需要使用定义的转换器装饰您的类:
[JsonConverter(typeof(LeagueUserConverter))]
public class LeagueUser
{
public long Id { get; set; }
public string Name { get; set; }
public int ProfileIconId { get; set; }
public int SummonerLevel { get; set; }
public long RevisionDate { get; set; }
}
无论您在哪里需要调用DeserializeObject
方法:
var user = JsonConvert.DeserializeObject<LeagueUser>(json);
其中json
变量是您在问题中发布的 JSON 字符串。