C# 读取JSON对象
我正在尝试使用JavaScriptSerializer读取JSON对象。目前我无法用代码读取JSON对象 下面是我的JSON对象C# 读取JSON对象,c#,javascript,asp.net,asp.net-mvc,json,C#,Javascript,Asp.net,Asp.net Mvc,Json,我正在尝试使用JavaScriptSerializer读取JSON对象。目前我无法用代码读取JSON对象 下面是我的JSON对象 {"data":[{"id":17,"name":"RedBug Project","can_modify":true,"description":"","start_date":"1899-01-01T00:00:00Z","due_date":"1899-01-01T00:00:00Z","is_active":true,"parent":{"id":0}},{"
{"data":[{"id":17,"name":"RedBug Project","can_modify":true,"description":"","start_date":"1899-01-01T00:00:00Z","due_date":"1899-01-01T00:00:00Z","is_active":true,"parent":{"id":0}},{"id":14,"name":"RedRock","can_modify":true,"description":"","start_date":"1899-01-01T00:00:00Z","due_date":"1899-01-01T00:00:00Z","is_active":true,"parent":{"id":0},"children":[{"id":16,"name":"WEB","can_modify":true,"description":"","start_date":"1899-01-01T00:00:00Z","due_date":"1899-01-01T00:00:00Z","is_active":true,"parent":{"id":14}}]}]}
方法来读取JSON
public Dictionary<string, string> ReadJSONProject(string jsObject)
{
var json = jsObject;
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic jsonObject = serializer.Deserialize<dynamic>(json);
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in jsonObject)
{
var a = item;
dic.Add(item["id"], item["name"]);
}
return dic;
}
参考下面的示例,并根据需要进行修改
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Objects;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Runtime.Serialization.Json;
using System.Threading;
using System.Xml;
using ConsoleDemo.Controller;
using ConsoleDemo.Model;
using Microsoft.Practices.Unity;
namespace ConsoleDemo
{
class Program
{
static void Main(string[] args)
{
var data = @"{""Root"": {""data"": [{""CardName"": ""card1"",""functions"": [{""State"": ""OPEN""},{""State"": ""INHERENT""}]},{""CardName"": ""card2"",""functions"": [{""State"": ""CLOSED""},{""State"": ""INHERENT""}]}]}";
RootClass dynObj = JsonHelper.JsonDeserialize<RootClass>(data); //Get the object
Console.ReadKey();
}
}
[DataContract]
public class RootClass
{
[DataMember(Name = "Root")]
public Data Root { get; set; }
}
[DataContract]
public class Data
{
[DataMember(Name = "data")]
public List<Card> data { get; set; }
}
[DataContract]
public class Card
{
[DataMember(Name = "CardName")]
public string CardName { get; set; }
[DataMember(Name = "functions")]
public List<Function> Functions { get; set; }
}
[DataContract]
public class Function
{
[DataMember(Name = "State")]
public string State { get; set; }
}
public class JsonHelper
{
/// <summary>
/// JSON Serialization
/// </summary>
public static string JsonSerializer<T>(T t)
{
var ser = new DataContractJsonSerializer(typeof(T));
var ms = new MemoryStream();
ser.WriteObject(ms, t);
var jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
}
/// <summary>
/// JSON Deserialization
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
var ser = new DataContractJsonSerializer(typeof(T));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
var obj = (T)ser.ReadObject(ms);
return obj;
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Data.Object;
使用System.Data.SqlClient;
利用制度全球化;
使用System.IO;
使用System.Linq;
使用System.Runtime.Serialization;
使用系统文本;
使用System.Runtime.Serialization.Json;
使用系统线程;
使用System.Xml;
使用ConsoleDemo.Controller;
使用ConsoleDemo.Model;
使用Microsoft.Practices.Unity;
名称空间控制台
{
班级计划
{
静态void Main(字符串[]参数)
{
var data=@“{”“根”“:{”“数据”“:[{”“卡片名”“:”“卡片1”“,”“函数”“:[{”“状态”“:”“打开”“},{”“状态”“:”“固有”“}]},{”“卡片名”“:”“卡片2”“,”“函数”“:[{”“状态”“:”“闭合”“},{”“状态”“:”“固有”“}]}”;
RootClass dynObj=JsonHelper.JsonDeserialize(数据);//获取对象
Console.ReadKey();
}
}
[数据合同]
公共类根类
{
[DataMember(Name=“Root”)]
公共数据根{get;set;}
}
[数据合同]
公共类数据
{
[DataMember(Name=“data”)]
公共列表数据{get;set;}
}
[数据合同]
公务舱卡
{
[DataMember(Name=“CardName”)]
公共字符串CardName{get;set;}
[DataMember(Name=“functions”)]
公共列表函数{get;set;}
}
[数据合同]
公共类函数
{
[数据成员(Name=“State”)]
公共字符串状态{get;set;}
}
公共类JsonHelper
{
///
///JSON序列化
///
公共静态字符串JsonSerializer(T)
{
var ser=新数据契约JSONSerializer(类型(T));
var ms=新内存流();
ser.WriteObject(ms,t);
var jsonString=Encoding.UTF8.GetString(ms.ToArray());
Close女士();
返回jsonString;
}
///
///JSON反序列化
///
公共静态T JsonDeserialize(字符串jsonString)
{
var ser=新数据契约JSONSerializer(类型(T));
var ms=newmemoryStream(Encoding.UTF8.GetBytes(jsonString));
var obj=(T)ser.ReadObject(ms);
返回obj;
}
}
}
命名空间WebApplication2
{
公共部分类WebForm3:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
字符串s=@“{”“数据”“:[{”“id”“:17”“名称”“:”“红虫项目”“可以修改”“:真”“描述”“:”“,”“开始日期”“:”“1899-01-01T00:00:00Z”“到期日期”“:”“1899-01-01T00:00:00Z”“是否处于活动状态”“:真”“父”“:{”“id”“:0}},{”“id”“:14”“名称”“:”“红石”“,”“可以修改”“:真”“描述”“:”“开始日期”“,”“1899-01:00:00Z”“到期日期”“。”“:”1899-01-01T00:00:00Z“,”是有效的“:真的“,”父“:{”id“:0}”,“子“:[{”id“:16”,“名称“:”WEB“,”可以修改“:真的“,”描述“:”,”开始日期“:”1899-01-01T00:00:00Z“,”到期日期“:”1899-01-01T00:00:00Z“,”是有效的“:真的“,”父“:”id“:14}”;
ReadJSon项目;
}
受保护的字典ReadJSONProject(字符串jsObject)
{
var json=jsObject;
JavaScriptSerializer serializer=新的JavaScriptSerializer();
动态jsonObject=serializer.Deserialize(json);
Dictionary dic=新字典();
var data=jsonObject[“数据”];
foreach(数据中的var记录)
{
var id=((int)记录[“id]”)。ToString();
变量名称=记录[“名称”]作为字符串;
dic.添加(id、姓名);
}
返回dic;
}
}
}
foreach循环中的成员“data”是一个数组。您需要迭代该数组的元素以访问“id”和“name”。这是我的实现,不需要使用动态,顺便说一句,您可以轻松地将复杂的json转换为c类
public class Item
{
public string id { get; set; }
public string name { get; set; }
public bool can_modify { get; set; }
public string description { get; set; }
public string start_date { get; set; }
public string due_date { get; set; }
public bool is_active { get; set; }
public Item parent { get; set; }
public List<Item> children { get; set; }
}
public class RootObject
{
public List<Item> data { get; set; }
}
public Dictionary<string, string> ReadJSONProject(string jsObject)
{
var json = jsObject;
JavaScriptSerializer serializer = new JavaScriptSerializer();
var jsonObject = serializer.Deserialize<RootObject>(json);
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in jsonObject.data)
{
dic.Add(item.id, item.name);
}
return dic;
}
公共类项目
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
公共bool可以修改{get;set;}
公共字符串说明{get;set;}
公共字符串开始日期{get;set;}
公共字符串到期日{get;set;}
公共布尔是活动的{get;set;}
公共项父项{get;set;}
公共列表子项{get;set;}
}
公共类根对象
{
公共列表数据{get;set;}
}
公共字典ReadJSONProject(字符串jsObject)
{
var json=jsObject;
JavaScriptSerializer serializer=新的JavaScriptSerializer();
var jsonObject=serializer.Deserialize(json);
Dictionary dic=新字典();
foreach(jsonObject.data中的var项)
{
dic.Add(项目id、项目名称);
}
返回dic;
}
调试代码后,jsonObject变成了一个字典
。我认为你应该使用类,而不是使用动态
。还要注意的是,你的foreach
循环只循环一次……jsonObject中只有一个项目,那就是一个多数组的数组。无论如何,我得到的代码完全符合你的要求。S请看下面我的答案。
namespace WebApplication2
{
public partial class WebForm3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string s = @"{""data"":[{""id"":17,""name"":""RedBug Project"",""can_modify"":true,""description"":"""",""start_date"":""1899-01-01T00:00:00Z"",""due_date"":""1899-01-01T00:00:00Z"",""is_active"":true,""parent"":{""id"":0}},{""id"":14,""name"":""RedRock"",""can_modify"":true,""description"":"""",""start_date"":""1899-01-01T00:00:00Z"",""due_date"":""1899-01-01T00:00:00Z"",""is_active"":true,""parent"":{""id"":0},""children"":[{""id"":16,""name"":""WEB"",""can_modify"":true,""description"":"""",""start_date"":""1899-01-01T00:00:00Z"",""due_date"":""1899-01-01T00:00:00Z"",""is_active"":true,""parent"":{""id"":14}}]}]}";
ReadJSONProject(s);
}
protected Dictionary<string, string> ReadJSONProject(string jsObject)
{
var json = jsObject;
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic jsonObject = serializer.Deserialize<dynamic>(json);
Dictionary<string, string> dic = new Dictionary<string, string>();
var data = jsonObject["data"];
foreach (var record in data)
{
var id = ((int)record["id"]).ToString();
var name = record["name"] as string;
dic.Add(id, name);
}
return dic;
}
}
}
public class Item
{
public string id { get; set; }
public string name { get; set; }
public bool can_modify { get; set; }
public string description { get; set; }
public string start_date { get; set; }
public string due_date { get; set; }
public bool is_active { get; set; }
public Item parent { get; set; }
public List<Item> children { get; set; }
}
public class RootObject
{
public List<Item> data { get; set; }
}
public Dictionary<string, string> ReadJSONProject(string jsObject)
{
var json = jsObject;
JavaScriptSerializer serializer = new JavaScriptSerializer();
var jsonObject = serializer.Deserialize<RootObject>(json);
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in jsonObject.data)
{
dic.Add(item.id, item.name);
}
return dic;
}