C#Json序列化:多变量作为数组

C#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.

我正在试验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.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
属性的中间类。请注意,谢谢大家-当我读到这个问题时,我像个傻瓜一样跳了起来-注释删除了需要更多的咖啡。。。