【问题标题】:C# Json serialization: Multiple variables as arrayC# Json 序列化:多个变量作为数组
【发布时间】:2016-11-30 13:58:40
【问题描述】:

我正在试验 Newtonsoft.Json 序列化程序,我想知道是否可以说一个类的多个变量放在一个数组中而不是单独的值中。 例如,采用具有 3 个浮点数的 Vector3 结构: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
      }

提前致谢!

【问题讨论】:

  • @GeoffJames:这根本不是真的——请求 JSON 是完全有效的。见tools.ietf.org/html/rfc7159#section-5
  • @GeoffJames { "myVector3": [ 0.0, 0.0, 0.0 ] } 是完全有效的 JSON - 将其反序列化为这样的类将是非常规的,但最终是应用程序的选择。就个人而言,如果我有那个 JSON 结构和那个类,我会使用一个带有 public decimal[] myVector3 属性的中间类。
  • 请注意,谢谢你们 - 当我读到这个问题时,我像个傻瓜一样跳了起来 - 评论已删除 需要更多咖啡...

标签: c# arrays json


【解决方案1】:

我对此的研究得出以下结论:

您需要自己的自定义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;
}

然后你可以像这样使用它:

        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]"

【讨论】:

    【解决方案2】:

    不,它需要包含键和值。在这里查看json

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多