将JSON字符串序列化为动态对象

时间:2015-08-24 16:49:01

标签: c# json

好的,如果我的术语有错,请原谅我。我试图做以下事情。

  1. 从网址
  2. 获取JSON字符串
  3. 将所述字符串解析为对象。
  4. 通常对我来说这很容易。通常,JSON对象是静态名称。

    问题出现时,子json对象因人而异。如果您更改库存,它们也会发生变化。

    现在,我需要能够将它放入一个对象中,然后查询它(不一定是linq,而是随意拉取数据)。有没有人有任何信息?我尝试创建一个动态对象(如Deserialize JSON into C# dynamic object?所示),但它对我不起作用。

    该链接是否真的符合我的目的,我是否只是错误地实现了它?

    以下是JSON的转储:http://chopapp.com/#ro46jfay

    感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

Newtonsoft Json.net支持从json创建动态对象。

var obj = JsonConvert.DeserializeObject<dynamic>(json); 

答案 1 :(得分:2)

事实上,您的数据并不像您想象的那样动态。所有这些用作属性名称的ID都可以反序列化为Dictionary<string,SomeObject>

虽然您的json比this question中的json更复杂,但可以轻松使用相同的想法。

所以你的模型可以如下:

public class RGInventory
{
    public string id { get; set; }
    public string classid { get; set; }
    public string instanceid { get; set; }
    public string amount { get; set; }
    public int pos { get; set; }
}

public class AppData
{
    public string def_index { get; set; }
    public int is_itemset_name { get; set; }
}

public class Description
{
    public string type { get; set; }
    public string value { get; set; }
    public string color { get; set; }
    public AppData app_data { get; set; }
}

public class Action
{
    public string name { get; set; }
    public string link { get; set; }
}

public class MarketAction
{
    public string name { get; set; }
    public string link { get; set; }
}

public class Tag
{
    public string internal_name { get; set; }
    public string name { get; set; }
    public string category { get; set; }
    public string category_name { get; set; }
    public string color { get; set; }
}

public class RGDescription
{
    public string appid { get; set; }
    public string classid { get; set; }
    public string instanceid { get; set; }
    public string icon_url { get; set; }
    public string icon_url_large { get; set; }
    public string icon_drag_url { get; set; }
    public string name { get; set; }
    public string market_hash_name { get; set; }
    public string market_name { get; set; }
    public string name_color { get; set; }
    public string background_color { get; set; }
    public string type { get; set; }
    public int tradable { get; set; }
    public int marketable { get; set; }
    public int commodity { get; set; }
    public string market_tradable_restriction { get; set; }
    public List<Description> descriptions { get; set; }
    public List<Action> actions { get; set; }
    public List<MarketAction> market_actions { get; set; }
    public List<Tag> tags { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public bool more { get; set; }
    public bool more_start { get; set; }
    public Dictionary<string, RGInventory> rgInventory { get; set; }
    public Dictionary<string, RGDescription> rgDescriptions { get; set; }
}

现在您可以反序列化(使用Json.Net

var obj = JsonConvert.DeserializeObject<RootObject>(json);
  

层次结构如下:ROOT - &gt; rgDescriptios - &gt; RandomName如何访问所有随机名称及其子项?

示例linq可以写为

var appids = obj.rgDescriptions.Select(x => x.Value.appid).ToList();

以类型安全的方式。