JSON对象到属性
本文关键字:属性 对象 JSON | 更新日期: 2023-09-27 18:11:18
我想在属性中存储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"];
最后一个问题是:我如何在模型的属性中存储来自我的jobobject的每个值,并最终显示到我的视图中?
提前感谢。
/编辑/我现在的模型是:
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"]; }
}
但是没有成功。= (
假设您有以下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; }
}
我推荐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>();
也非常快!
如果您使用Json.net,您可以直接反序列化到clr对象(可以是您的视图模型或模型),您将不必处理JObject。
JsonConvert.DeserializeObject<myviewmodelormodel>(myjsondata);
如果您以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;
}
,
- 调用url获取字符串形式的结果集,然后调用扩展方法返回对象。
- url返回MyPOCO
var stringValue = HttpGet(url);//how you get the value from a web service call var myUserModel = stringValue.Deserialize<MyPOCO>();