C#Json序列化:多变量作为数组
我正在试验Newtonsoft.Json序列化程序,我想知道是否可以说一个类的多个变量被放入一个数组中,而不是单独的值。 例如,假设Vector3结构具有3个浮动:x、y和zC#Json序列化:多变量作为数组,c#,arrays,json,C#,Arrays,Json,我正在试验Newtonsoft.Json序列化程序,我想知道是否可以说一个类的多个变量被放入一个数组中,而不是单独的值。 例如,假设Vector3结构具有3个浮动:x、y和z public class myVector3 { public float X, Y, Z; } 你能让它看起来像这样吗: “myVector3”:[0.0,0.0,0.0] 而不是 "myVector3": { "X": 0.0, "Y": 0.0, "Z": 0.
public class myVector3
{
public float X, Y, Z;
}
你能让它看起来像这样吗:
“myVector3”:[0.0,0.0,0.0]
而不是
"myVector3": {
"X": 0.0,
"Y": 0.0,
"Z": 0.0
}
提前谢谢 否,它需要包含键和值。检查这里我对此的研究得出以下结论: 您需要自己定制的
JsonConverter
来提取向量的X,Y,Z
值,并将它们转换为某种浮点数组:
public class VectorSerializer : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var token = JToken.FromObject(value);
var x = token["X"].Value<float>();
var y = token["Y"].Value<float>();
var z = token["Z"].Value<float>();
var vector = new[] { x, y, z };
var o = JArray.FromObject(vector);
o.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var item = JObject.Load(reader);
var vector = item["myVector3"].ToObject<float[]>();
return new myVector3 { X = vector[0], Y = vector[1], Z = vector[2] };
}
public override bool CanConvert(Type objectType)
{
return typeof(myVector3).IsAssignableFrom(objectType);
}
}
public class myVector3
{
public float X, Y, Z;
}
公共类向量序列化器:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
var token=JToken.FromObject(值);
var x=标记[“x”].Value();
var y=token[“y”].Value();
var z=标记[“z”].Value();
var向量=新[]{x,y,z};
var o=JArray.FromObject(向量);
o、 书面(作者);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var item=JObject.Load(读卡器);
var vector=item[“myVector3”].ToObject();
返回新的myVector3{X=vector[0],Y=vector[1],Z=vector[2]};
}
公共覆盖布尔CanConvert(类型objectType)
{
返回typeof(myVector3).IsAssignableFrom(objectType);
}
}
公共类myVector3
{
公共浮动X,Y,Z;
}
然后你可以这样使用它:
var vectorFromString = JsonConvert.DeserializeObject<myVector3>("{\"myVector3\": [1.0, 1.5, 2.5]}", new VectorSerializer());
//You'll get your vector object from this string ^
var vectorToString = JsonConvert.SerializeObject(vectorFromString, new VectorSerializer());
//Output: "[1.0, 1.5, 2.5]"
var vectorFromString=JsonConvert.DeserializeObject(“{\“myVector3\”:[1.0,1.5,2.5]}”,新VectorSerializer());
//您将从该字符串获取向量对象^
var vectorToString=JsonConvert.SerializeObject(vectorFromString,new VectorSerializer());
//输出:“[1.0,1.5,2.5]”
@GeoffJames:那根本不是真的-请求JSON是完全有效的。请参见@GeoffJames{“myVector3”:[0.0,0.0,0.0]}
是完全有效的JSON-将其反序列化到这样的类将是非常规的,但最终是应用程序的选择。就我个人而言,如果我有那个JSON结构和那个类,我会使用一个带有public decimal[]myVector3
属性的中间类。请注意,谢谢大家-当我读到这个问题时,我像个傻瓜一样跳了起来-注释删除了需要更多的咖啡。。。