读书人

怎么将JSON格式转化成类也可以将类转

发布时间: 2013-11-12 12:10:37 作者: rapoo

如何将JSON格式转化成类,也可以将类转换成JSON
如题,如何将JSON转换成类,将类转化成JSON,就是可以相互转换! JSON 类
[解决办法]
给你个最简单的例子:引用Newtonsoft.Json.dll

 class Program
{
static void Main(string[] args)
{
Student student = new Student();
student.Name = "guwei4037";
student.Age = 7;
string json = JsonConvert.SerializeObject(student);//序列化输出Json字符串
Console.WriteLine(json);

Student jsonObject = JsonConvert.DeserializeObject<Student>(json);
Console.WriteLine(string.Join(" ", jsonObject.Name, jsonObject.Age));//反序列化输出 guwei4037和7
}
}

public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}

更多信息请参考:http://blog.csdn.net/chinacsharper/article/details/9246627
[解决办法]
引用:
Quote: 引用:

这叫序列化和反序列化
对的,我把消息设置成了父类,根据5种消息类型设置成了子类,假如说给了我一个json,我怎么把json中的数据解析到对应的类中呢?

那先从Json字符串里先获取"MessageType"的值,可以用JsonReader试试(应该能读出来的),或者用正则表达式,然后用switch选择要反序列化到的某个子类(Text,Image...);
或者不用子类, 就把你上面的类加个字段MessageType, 当json串里面没有的属性,反序列化的时候会自动用null(比如你消息是Text,传进来的Josn里面可能没有URL,但这不会影响反序列化,只是url属性为null)
[解决办法]
引用:
请教大家一个问题,我想根据MsgType(消息的类型)来将这些属性归类,


举一个使用json.net解析的例子。

首先你可以定义一个通用的“命令”类型,例如
    public class Command
{
public long Num; //命令序号。如果为负数,表示是返回。
public string Type; //命令实体类型。
public JToken Data; //命令实体的json序列化(但是不是序列化为string,而是 JToken
}


对于接收信息端,可以这样处理
string input = ......;
msg = (Command)JsonConvert.DeserializeObject(input, typeof(Command));
var type = GetDataType(msg.Type); //查询Data属性目标类型
var obj = msg.Data.ToObject(type);


通过 JToken 的 ToObject(type) 方法,可以自动将 JToken 转换为 对象实例。

例如要接下来执行这样的命令,通常还会写
var cmd = obj as MyCommand;
if(cmd != null)
{
var ret = cmd.Execute(msg); //执行cmd这个命令
将ret返回给客户端
}



而发送端,则是这样
            var cmd = new Command
{
Num = number, //命令顺序号
Type = message.GetType().Name,
Data = JToken.FromObject(message)
var output = JsonConvert.SerializeObject(cmd);
};




关于 GetDataType 方法,这通常是在系统初始化时遍历系统中的所有命令类型(通过Attribute标识)来收集到一个 Dictionary<string, Type> 集合里边。或者你可以通过.net framework内置的 MEF 机制自动收集所有的命令类型集合。或者你可以写一个初始化方法让最终启动程序手工将命令类型加入这个集合中。

无论如何,这个解析程序是在最终的启动程序之前就开发好的,它不依赖于任何具体的待解析类型,不会去想当然地在解析程序中写死 Student 之类的类型。

读书人网 >C#

热点推荐