我想将JSON的结果存储在属性中,但我不知道如何。我正在使用ASP.NET和MVC 4 / Razor。
我的模型的构造函数是:
public UserModel()
{
WebClient request = new WebClient();
string response = request.DownloadString(url);
JObject _naturalUserObject = (JObject)JsonConvert.DeserializeObject(response);
}
我有以下属性:
[Key]
public int Id { get; set; }
public int DisplayName { get; set; }
public int Avatar { get; set; }
从我的JSON访问一个简单的值:
_naturalUserObject["users"][0]["name"];
最后一个问题是:如何在我的模型属性中存储JObject中的每个值,最后将其显示在我的视图中?
提前致谢。
/编辑/ 我的模特现在是:
public UserModel()
{
WebClient request = new WebClient();
string response = request.DownloadString(String.Format("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={0}&steamids={1}", ConfigurationManager.AppSettings["SteamApiKey"].ToString(), HttpContext.Current.Request.Cookies["SteamIdCookie"].Value));
string _naturalUserObject = JsonConvert.DeserializeObject<string>(response);
}
我的一个属性是:
private string _avatar;
public string Avatar
{
get { return _avatar; }
set { _avatar = _naturalUserObject["response"]["players"][0]["avatar"]; }
}
但没有成功。 =(
答案 0 :(得分:5)
假设你有以下Json
string yourJsonString = "{\"FIRST_NAME\":\"Foo\",\"LAST_NAME\":\"Bar\"}";
您可以将此Json建模为:
public class JsonModel
{
[JsonProperty("FIRST_NAME")]
public string FirstName {get; set;}
[JsonProperty("LAST_NAME")]
public string LastName {get; set;}
}
请注意,您可以使用JsonPropertyAttribute
告诉Json.Net
该属性的相应json字段是什么。
现在,您已经设置了模型,可以使用JsonConvert.DeserializeObject<T>(...)
来获取json模型的强类型实例。
JsonModel jsonModel = JsonConvert.DeserializeObject<JsonModel>(yourJsonString);
string firstName = jsonModel.FirstName; // Foo
string lastName = jsonModel.LastName; // Bar
正如有人提到过的,如果你这样做,你就不必处理JObject
而且,它会迫使你真正理解被返回的json的结构。
特别是在您的示例中,您可以存储类型为JsonModel
的对象,并在模型的构造函数中使用JsonConvert.DeserializeObject<T>
对其进行初始化。然后,您的公共属性可以调用JsonModel
实例并获取适当的值。
这是一个更详细的例子。假设你要回到我上面提供的json,并使用我们之前创建的相同模型。假设您的类JsonModel
private JsonModel jsonModel;
您可以在构造函数中初始化它:
public UserModel()
{
WebClient request = new WebClient();
string response = request.DownloadString(url);
jsonModel = JsonConvert.DeserializeObject<JsonModel>(response);
}
现在,您的公共属性可以简单地调用此JsonModel
对象。
public string FirstName
{
get { return jsonModel.FirstName; }
set { jsonModel.FirstName = value; }
}
答案 1 :(得分:1)
如果您使用Json.net,您可以直接反序列化为clr对象(可能是您的视图模型或模型),您不必处理JObject。
JsonConvert.DeserializeObject<myviewmodelormodel>(myjsondata);
答案 2 :(得分:1)
我建议使用ServiceStack.Text
(作为独立的NuGet软件包安装,如果您不需要,可以不使用框架的其余部分)。
这增加了两个不错的扩展方法:
public class MyPOCO
{
public string Name {get; set; }
public int Age {get; set; }
}
后来:
string json = myPocoInstance.ToJson();
和
MyPOCO instance = jsonString.FromJson<MyPOCO>();
也很快!
答案 3 :(得分:0)
如果以JSON格式将对象作为字符串返回。您可以像这样使用JSON反序列化器:
将它放入静态类中,这将成为所有字符串的扩展方法
public static T Deserialize<T>(this string json)
{
var obj = Activator.CreateInstance<T>();
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T) serializer.ReadObject(ms);
}
return obj;
}
<强> EX:强>
var stringValue = HttpGet(url);//how you get the value from a web service call var myUserModel = stringValue.Deserialize<MyPOCO>();