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对象到属性

假设您有以下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>();
相关文章: