JSON对象属性

时间:2013-04-29 18:33:12

标签: c# asp.net-mvc json asp.net-mvc-4

我想将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"]; }
    }

但没有成功。 =(

4 个答案:

答案 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:

  • 这会调用一个url来获取字符串中的结果集,然后调用 返回对象的扩展方法。
  • 网址返回MyPOCO
var stringValue = HttpGet(url);//how you get the value from a web service call
var myUserModel = stringValue.Deserialize<MyPOCO>();