2016-11-30 18 views
3

私はNewtonsoft.Jsonシリアライザを試していますが、クラスの複数の変数が別々の値ではなく配列の中に置かれていると言うことは可能でしょうか? たとえば、x、y、zの3つの浮動小数点数を持つVector3構造体をとります。C#Jsonシリアライゼーション:配列としての複数の変数

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 
     } 

ありがとう!

+0

@GeoffJ ames:それは単に真実ではありません - 要求JSONは完全に有効です。 https://tools.ietf.org/html/rfc7159#section-5 –

+1

を参照してください。@GeoffJames '{" myVector3 ":[0.0、0.0、0.0]}'は完全に有効なJSONです。そういうクラスにデシリアライズします慣習的ではありませんが、最終的にはアプリケーションの選択です。個人的にJSON構造体とそのクラスがあれば、 'public decimal [] myVector3'プロパティを持つ中間クラスを使用します。 –

+0

Noted、ありがとう皆さん - 私は質問を読んだときにnumptyのような銃を飛ばしました - コメントは削除されました*もっとコーヒーが必要です... * –

答えて

-3

いいえ、キーと値を含める必要があります。私はJson.NET自分とあまりにも良いではないんだと、私と一緒にここにjson

0

ベア確認し、これへの私の研究は、以下が得られた:

あなたはX, Y, Z値を引き出すために、独自のカスタムJsonConverterが必要になりますがあなたのベクトルのとfloat配列のいくつかの種類にそれらを回す:

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]" 
関連する問題