.NET类库Newtonsoft.Json的各json与对之应的Model记录

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式(如json,xml)的过程。


1.简单JSON:

"{'BookID':'123', 'PublishDate':'2011-1-2', 'Price':23.5}"
 public class Book
    {
        public string BookID { get; set; }
        public DateTime PublishDate { get; set; }
        public decimal Price { get; set; }
    }

2.一级嵌套的json:

{"name":"lex","age":26,"addr":{"city":"NanTong","province":"JiangSu"}}
public class UserInfo
{
public string name { get; set; }
public int age { get; set; }
public address addr { get; set; }
}

public class address
{
public string city { get; set; }
public string province { get; set; }
}

3.不确定类型的json使用JObject:

static void Main(string[] args)
 {
  string str = "{title:123,body:456,list:{title:'标题',body:'内容'}}";
  JObject o = JObject.Parse(str);
  Console.WriteLine(o["title"]);
  Console.WriteLine(o["body"]);
  Console.WriteLine(o["list"]["title"]);
  Console.WriteLine(o["list"]["body"]);
  Console.ReadKey();
 }

4.多级嵌套的json:

//bootstrap treeview,数据结构为
[
    {
            id:'1', //节点id
            text: '父节点',  //节点显示文本
            icon: 'glyphicon glyphicon-cloud-download',  //节点图标样式
            nodes:[{id:'2',text:'子节点'}]  //子节点
    }
]

//zTree
[  
    { "id" : "1", "name" : "父节点1", "children" : [{id:'4',name:'子节点1'}] },  
    { "id" : "2", "name" : "父节点2", "children" : [{id:'5',name:'子节点2'}] },  
    { "id" : "3", "name" : "父节点3", "children" : [{id:'6',name:'子节点3'}] }  
]
    /// <summary>
    /// 树形实体
    /// </summary>
    public class Tree
    {
        /// <summary>
        /// 当前ID
        /// </summary>
        public string id { get; set; }

        /// <summary>
        /// 文本
        /// </summary>
        public string text { get; set; }

        /// <summary>
        /// 附加信息
        /// </summary>
        public string Tag { get; set; }

        /// <summary>
        /// 节点图标
        /// </summary>
        public string Icon { get; set; }

        /// <summary>
        /// 子级
        /// </summary>
        public List<Tree> nodes { get; set; }
    }
不同字段名称,相同层级结构,使用了动态改变属性序列化名称方案后,前后台完全解绑了,不管前台使用什么树形控件,后台实体只有一个树形实体。我们要做的仅仅是设置一下字段映射关系而已。
/// <summary>
/// 动态属性转换约定
/// </summary>
/// <remarks>
/// 处理场景 树形结构数据 后台代码实体定义 为 Id Childrens 但是前台树形控件所需数据结构为  id,nodes
/// 这个时候可以使用该属性约定转换类 动态设置 序列化后字段名称
/// </remarks>
/// <example>
///     JsonSerializerSettings setting = new JsonSerializerSettings();
///     setting.ContractResolver = new PropsContractResolver(new Dictionary<string, string> { { "Id", "id" }, { "Text", "text" }, { "Childrens", "nodes" } });
///     string AA = JsonConvert.SerializeObject(cc, Formatting.Indented, setting);
/// </example>
public class PropsContractResolver : DefaultContractResolver
{
    Dictionary<string, string> dict_props = null;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="props">传入的属性数组</param>
    public PropsContractResolver(Dictionary<string, string> dictPropertyName)
    {
        //指定字段要序列化成什么名称
        this.dict_props = dictPropertyName;
    }

    protected override string ResolvePropertyName(string propertyName)
    {
        string newPropertyName = string.Empty;
        if (dict_props != null && dict_props.TryGetValue(propertyName, out newPropertyName))
        {
            return newPropertyName;
        }
        else
        {
            return base.ResolvePropertyName(propertyName);
        }
    }
}

调用代码实例:

/// <summary>
/// 树形实体
/// </summary>
public class Tree
{
    /// <summary>
    /// 当前ID
    /// </summary>
    public string Id { get; set; }

    /// <summary>
    /// 文本
    /// </summary>
    public string Text { get; set; }

    /// <summary>
    /// 附加信息
    /// </summary>
    public string Tag { get; set; }

    /// <summary>
    /// 节点图标
    /// </summary>
    public string Icon { get; set; }

    /// <summary>
    /// 子级
    /// </summary>
    public List<Tree> Childrens { get; set; }
}


string type="zTree";
//字段映射关系
Dictionary<string, string> _dictProp = null;
if(type=="zTree")
{
  _dictProp = new Dictionary<string, string> { { "Icon", "icon" }, { "Text", "name" }, { "Childrens", "children" } };
}
else if(type=="treeview")
{
  _dictProp = new Dictionary<string, string> { { "Icon", "icon" }, { "Text", "text" }, { "Childrens", "nodes" } };
}
      
// 序列化设置
JsonSerializerSettings PropSettings = new JsonSerializerSettings 
{ 
  ContractResolver = new PropsContractResolver(_dictProp)
};
return JsonConvert.SerializeObject(new List<Tree>(), Formatting.None, PropSettings);
5.Json数组
"[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]"
public class Customer  
{   
    public string a { get; set; }   
    public string b { get; set; }  
    public string c { get; set; }  
    public string Other { get; set; }  
    public Customer()  
    {   
        a = "";  
        b = "";  
        c = "";  
        Other = null;  
    }  
}
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
//方法1
JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);  
JObject o = (JObject)ja[1];  
Console.WriteLine(o["a"]);  
Console.WriteLine(ja[1]["a"]);    

//方法2
List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);  
Console.WriteLine(_list[1].a);  
foreach (Customer c in _list)  
{  
   Console.WriteLine(c.c);  
}









  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值