1 Star 0 Fork 0

New佳佳 / NearExtensions

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

[TOC]

NearExtensions

介绍

自用扩展,交流群:438789123 ,51492982

使用前请导入空间名

c# using NearExtensions;

vb Imports NearExtensions


1. Json 扩展

Core3.0 下默认使用 System.Text.Json

其他框架需Nuget : Newtonsoft.Json

参数 说明
isIgnoreNull 是否忽略空值,默认启用
isIndented 是否保留缩进格式,默认关闭
isInterface 用于序列化接口,默认关闭
dateFormatString 日期默认格式,默认为空,可设置为 yyyy-MM-dd HH:mm:ss

1.1 SerializerJson方法

将对象序列化成JSON字符串。

//c# 实体类
class Test1
{
    public string Name { get; set; }
    public DateTime DateTime { get; set; }
}
'vb 实体类
Public Class Test1
    Property Name As String
    Property DateTime As Date
End Class

1.1.1 基础用法

c#

//引入空间名
using NearExtensions;

//准备数据
var obj = new Test1() 
{ 
    DateTime = DateTime.MaxValue 
};

//序列化成JSON字符串
var json = obj.SerializerJson();

vb

'引入空间名
Imports NearExtensions

'准备数据
Dim obj = New Test1() With 
{
    .DateTime = Date.MaxValue
}

'序列化成JSON字符串
dim json = obj.SerializerJson()

输出

{"DateTime":"9999-12-31T23:59:59.9999999"}

1.1.2 保留格式和空值

//c#
var json = obj.SerializerJson(isIgnoreNull: false,isIndented:true);
'vb
Dim json = obj.SerializerJson(isIgnoreNull:=False, isIndented:=True)

输出

{
  "Name": null,
  "DateTime": "9999-12-31T23:59:59.9999999"
}

1.1.3 日期格式化

//c#
var json = obj.SerializerJson(dateFormatString: "yyyy-MM-dd");
'vb
Dim json = obj.SerializerJson(dateFormatString:="yyyy-MM-dd")

输出

{"DateTime":"9999-12-31"}

1.2 DeserializeJson方法

将字符串反序列化成对象

1.2.1 基础用法

//c#
var json = "{\"DateTime\":\"9999-12-31T23:59:59.9999999\"}";
var test1 = json.DeserializeJson<Test1>();
'vb
Dim json As String = <s>{"DateTime":"9999-12-31T23:59:59.9999999"}</s>
dim test1 = json.DeserializeJson(of Test1)()

1.2.2 反序列化接口

如果成员为接口类型,请使用DeserializeOptions.AddTypeConvert()方法添加类型转换。

//c# 实体类
interface IItem
{
    string Name { get; set; }
}

class Item : IItem
{
    public string Name { get; set; }
}

class Test2
{
    public IList<IItem> Items { get; set; }
}

//调用
var test2 = new Test2()
{
    Items = new List<IItem>()
    {
        new Item(){  Name = "A" },
        new Item(){  Name = "B" },
    }
};

//获得JSON
var json = test2.SerializerJson();

//使用DeserializeOptions添加类型转换
var deserializeOptions = new DeserializeOptions()
    .AddTypeConvert<IList<IItem>, List<Item>>();

//反序列化成对象
var obj = json.DeserializeJson<Test2>(deserializeOptions);

//验证结果
Debug.Assert(obj.Items.First().Name == test2.Items.First().Name);
'vb 实体类
Interface IItem
    Property Name As String
End Interface

Class Item
    Implements IItem
    Public Property Name As String Implements IItem.Name
End Class

Class Test2
    Property Items As IList(Of IItem)
End Class
    
'调用
Dim test2 = New Test2 With
{
    .Items = New List(Of IItem) From
    {
        New Item With {.Name = "A"},
        New Item With {.Name = "B"}
    }
}

'获得JSON文本
Dim json = test2.SerializerJson()

'使用DeserializeOptions添加类型转换
Dim deserializeOptions = New DeserializeOptions().
    AddTypeConvert(Of IList(Of IItem), List(Of Item))

'反序列化成对象
Dim obj = json.DeserializeJson(Of Test2)(deserializeOptions)

'验证结果
Debug.Assert(obj.Items.First().Name = test2.Items.First().Name)    
    

1.3 强制使用Newtonsoft.Json

默认情况下 .Net Core 3 使用 System.Text.Json 序列化,调用JsonHelper.SetNewtonsoftJsonProvider()方法后切换到Newtonsoft.Json


2. 序列化成XML

//c#
var test1 = new Test1() { Name = "A" };

//序列化
var xml = test1.SerializerXml();

//反序列化
var obj = xml.DeserializeXml<Test1>();

//验证结果
Debug.Assert(obj.Name == test1.Name);
'vb
Dim test1 = New Test1() With {.Name = "A"}

'序列化
Dim xml = test1.SerializerXml()

'反序列化
Dim obj = xml.DeserializeXml(Of Test1)

'验证结果
Debug.Assert(obj.Name = test1.Name)

3. 类型转换

缓存ConvertOptions可以提高性能, 使用AutoMapper性能会更好.

3.1 简单类型转换

//c# 实体类
class ClassA
{
    public string Name { get; set; }
}

class ClassB
{
    public string Name { get; set; }
}

//---调用
var data = new ClassA() { Name = "A" };

//执行转换(ClassA 转换为 ClassB)
var obj = data.ToObject<ClassB>();

//验证结果
Debug.Assert(obj is ClassB);
Debug.Assert(obj.Name == data.Name);
'vb 实体类
Class ClassA
    Property Name As String
End Class

Class ClassB
    Property Name As String
End Class
        
'---调用
Dim data = New ClassA With {.Name = "A"}

'执行转换(ClassA 转换为 ClassB)
Dim obj = data.ToObject(Of ClassB)

'验证结果
Debug.Assert(TypeOf obj Is ClassB)
Debug.Assert(obj.Name = data.Name)
        

3.2 接口成员转换

c#

//类定义
interface IItem
{
    string Name { get; set; }
}

class Item : IItem
{
    public string Name { get; set; }
}

class ClassC
{
    public IItem Item { get; set; }
}

class ClassD
{
    public Item Item { get; set; }
}

//---调用
//准备数据
var data = new ClassC()
{
    Item = new Item { Name = "A" }
};

//转换选项(添加类型)
//AddTypeConvert 方法用于类型映射,如果不能直接转换可使用委托转换.
//AddTypeConvert<IItem, Item>(x => x as Item);
var convertOptions = new ConvertOptions()
    .AddTypeConvert<IItem, Item>();

//转换成ClassD类型
var obj = data.ToObject<ClassD>(convertOptions);

//验证结果
Debug.Assert(obj.Item.Name == data.Item.Name);

vb

'实体类
Interface IItem
    Property Name As String
End Interface

Class Item
    Implements IItem
    Public Property Name As String Implements IItem.Name
End Class

Class ClassC
    Property Item As IItem
End Class

Class ClassD
    Property Item As Item
End Class
        
'---调用
'准备数据
Dim data = New ClassC With
{
    .Item = New Item With {.Name = "A"}
}

'转换选项(添加类型)
'AddTypeConvert 方法用于类型映射,如果不能直接转换可使用委托转换.
'AddTypeConvert(Of IItem, Item)(Function(x) => x as Item)

Dim convertOptions = New ConvertOptions().
    AddTypeConvert(Of IItem, Item)


'转换成ClassD类型
Dim obj = data.ToObject(Of ClassD)(convertOptions)

'验证结果
Debug.Assert(obj.Item.Name = data.Item.Name)

空文件

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/84819760/NearExtensions.git
git@gitee.com:84819760/NearExtensions.git
84819760
NearExtensions
NearExtensions
master

搜索帮助