如何使用C#获取json的项值?

时间:2014-08-22 04:10:16

标签: c# json json.net

如何使用C#获取json的项值?

JSON:

[{
    ID: '6512',
    fd: [{
        titie: 'Graph-01',
        type: 'graph',
        views: {
            graph: {
                show: true,
                state: {
                    group: 'DivisionName',
                    series: ['FieldWeight', 'FactoryWeight', 'Variance'],
                    graphType: 'lines-and-points'
                }
            }
        }
    }, {
        titie: 'Graph-02',
        type: 'Graph',
        views: {
            graph: {
                show: true,
                state: {
                    group: 'DivisionName',
                    series: ['FieldWeight', 'FactoryWeight', 'Variance'],
                    graphType: 'lines-and-points'
                }
            }
        }
    }]
}, {
    ID: '6506',
    fd: [{
        titie: 'Map-01',
        type: 'map',
        views: {
            map: {
                show: true,
                state: {
                    kpiField: 'P_BudgetAmount',
                    kpiSlabs: [{
                        id: 'P_BudgetAmount',
                        hues: ['#0fff03', '#eb0707'],
                        scales: '10'
                }]
                }
            }
        }
    }]
}]

上面提到的一个是json,这里的titie值将被列入一个列表 请帮帮我......

我的代码是:

string dashletsConfigPath = Url.Content("~/Content/Dashlets/Dashlets.json");
string jArray = System.IO.File.ReadAllText(Server.MapPath(dashletsConfigPath));
List<string> lists = new List<string>();
JArray list = JArray.Parse(jArray);
var ll = list.Select(j => j["fd"]).ToList();

然后json将转换为JArray  李得到了fd详细信息,然后我们在列表中得到了详细信息

6 个答案:

答案 0 :(得分:0)

我建议为对象创建一个类,并使用DataContractSerializer反序列化JSON字符串。

[DataContract]
public class Container
{
  [DataMember(Name="ID")]
  public string ID { get; set; }

  [DataMember(Name="fd")]
  public Graph[] fd { get; set; }
}

[DataContract]
public class Graph
{
  [DataMember(Name="title")]
  public string Title { get; set; }

  [DataMember(Name="type")]
  public string Type { get; set; }
}

这将为您提供围绕JSON的强类型类。

答案 1 :(得分:0)

我不确定您打算如何使用数据,但您可以从对象中收集所有titie值,如下所示:

var arr = JArray.Parse(json);
var query =
    from JObject obj in arr
    from JObject fd in obj["fd"]
    select new
    {
        Id = (string)obj["ID"],
        Titie = (string)fd["titie"],
    };

答案 2 :(得分:0)

如果您只想要List<string>“titie”(原文如此)属性值,这应该可以使用SelectMany

List<string> result = list.SelectMany(
    obj => obj["fd"]
        .Select(inner => inner["titie"].Value<string>()))
    .ToList()

这假定您发布的JSON通过引用属性名称生效。

答案 3 :(得分:0)

您可以使用json.net反序列化json字符串,如下所示:

public class Item
{
    public string ID { get; set; }
    public List<FD> fd { get; set; }
}

public class FD
{
    public string titie { get; set; }
    public string type { get; set; }
    public Views views { get; set; }
}

public class Views
{
    public Graph graph { get; set; }
}

public class Graph
{
    public bool show { get; set; }
    public State state { get; set; }
}

public class State
{
    public string group { get; set; }
    public string[] series { get; set; }
    public string graphType { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        string json = @"..."; //your json string

        var Items = JsonConvert.DeserializeObject<List<Item>>(json);

        List<string> tities = new List<string>();
        foreach (var Item in Items)
        {
            foreach (var fd in Item.fd)
            {
                tities.Add(fd.titie);
            }
        }

    }
}

答案 4 :(得分:0)

首先,你的json格式无效。得到下面的有效json。

[{ "ID": "6512", "fd": [{ "titie": "Graph-01", "type": "graph", "views": { "graph": { "show": true, "state": { "group": "DivisionName", "series": ["FieldWeight", "FactoryWeight", "Variance"], "graphType": "lines-and-points" } } } }, { "titie": "Graph-02", "type": "Graph", "views": { "graph": { "show": true, "state": { "group": "DivisionName", "series": ["FieldWeight", "FactoryWeight", "Variance"], "graphType": "lines-and-points" } } } }] }, { "ID": "6506", "fd": [{ "titie": "Map-01", "type": "map", "views": { "map": { "show": true, "state": { "kpiField": "P_BudgetAmount", "kpiSlabs": [{ "id": "P_BudgetAmount", "hues": ["#0fff03", "#eb0707"], "scales": "10" }] } } } }] }]

如果您想将项目作为单独的字符串阅读,请使用以下代码。

JArray jObject = JArray.Parse(json);

var ll = jObject.ToList();

答案 5 :(得分:0)

您可以使用Newtonsoft Json Library。

使用下面的模型对象

反序列化json字符串
   public class JsonWrapper
    {
        public string ID { get; set; }
        public List<Fd> fd { get; set; }
    }

 public class Fd
    {
        public string titie { get; set; }
        public string type { get; set; }
        public Views views { get; set; }
    }

public class Views
    {
        public Graph graph { get; set; }
    }

public class Graph
    {
        public bool show { get; set; }
        public State state { get; set; }
    }

 public class State
    {
        public string group { get; set; }
        public List<string> series { get; set; }
        public string graphType { get; set; }
    }

声明JsonWrapper类的对象并将json字符串反序列化为它。

JsonWrapper jsonWrapper = new JsonWrapper();
jsonWrapper = (JsonWrapper)JsonConvert.DeserializeObject(jsonString, jsonWrapper.getType());

然后,您可以从jsonWrapper对象访问所有列表和属性。