2

我想将 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 中的每个值存储在模型的属性中并最终将其显示到我的视图中?

提前致谢。

/EDIT/ 我现在的模型是:

    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

4 回答 4

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; }
}
于 2013-04-29T19:14:35.797 回答
1

如果您使用 Json.net,您可以直接反序列化为 clr 对象(可能是您的视图模型或模型),您不必处理 JObject。

JsonConvert.DeserializeObject<myviewmodelormodel>(myjsondata);
于 2013-04-29T18:35:04.307 回答
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>();

也非常快!

于 2013-04-29T18:37:03.817 回答
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;
}

前任:

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