我绝对不知道该怎么做。
我使用的示例类:
class MyClass
{
private Size _size = new Size(0, 0);
[DataMember]
public Size Size
{
get { return _size; }
set { _size = value; }
}
}
这将序列化为{size: "0, 0"}
。我需要的是{size: {width: 0, height: 0}}
。
任何帮助将不胜感激,谢谢。
这是一个简单的JsonConverter
,您可以用来使System.Drawing.Size
序列化的方式:
using System;
using System.Drawing;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class SizeJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Size));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Size size = (Size)value;
JObject jo = new JObject();
jo.Add("width", size.Width);
jo.Add("height", size.Height);
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
return new Size((int)jo["width"], (int)jo["height"]);
}
}
要使用转换器,您只需要将其实例传递给JsonConvert.SerializeObject
,如下所示:
MyClass widget = new MyClass { Size = new Size(80, 24) };
string json = JsonConvert.SerializeObject(widget, new SizeJsonConverter());
Console.WriteLine(json);
这将给出以下输出:
{"Size":{"width":80,"height":24}}
避难所以相同的方式工作;将转换器的实例传递给DeserializeObject<T>
:
string json = @"{""Size"":{""width"":80,""height"":24}}";
MyClass c = JsonConvert.DeserializeObject<MyClass>(json, new SizeJsonConverter());
Console.WriteLine(c.Size.Width + "x" + c.Size.Height);
输出:
80x24
就像布莱恩·罗杰斯(Brian Rogers)答案的快速附加方式一样,在(某种程度上?)的情况下,大小是较大类内的内部变量,您正在序列化/删除序列化。这可能是微不足道的,但是我是Newtonsoft的Json Parser的新手,我花了一些谷歌搜索才能找到正确的标签。
长话短说,如果您的班级使用大小作为其中的一部分,并且您想使用上述转换器。假设您的类称为代理的类,该类别是其定义的一部分,您应该做这样的事情:
public class Agent
{
[JsonConverter(typeof(SizeJsonConverter))]
public Size size = new Size();
public long time_observed = 0;
}
请注意,标签名称仍然是jsonConverter,但是它的类型是您从可接受的答案片段中创建的转换器子类。
希望能节省一些像我这样的新手几分钟的谷歌搜索。
您可以每次使用JSONProperty,而不是将每个单独的属性迫使每个单独的属性。
public class MyClass
{
[JsonProperty("size")]
public Size size;
}
这是您的大小类
public class Size
{
public Size(int w, int h)
{
this.Width = w;
this.Height = h;
}
[JsonProperty("width")]
public int Width
{
get;
set;
}
[JsonProperty("height")]
public int Height
{
get;
set;
}
}
这就是您的访问方式
MyClass w = new MyClass{ size = new Size(5, 7) };
string result = JsonConvert.SerializeObject(w);
这就是您得到的
{"Size":{"width":5,"height":7}}
这样,每当您在大小类甚至MyClass类中添加新属性时,您只需要将JSONPROPERTY属性放在上面。