2017-11-22 5 views
-1

は私のコードです:コンソールで私のカスタムタイプのシリアライズ/デシリアライズを強制するには?ここ

void Main() 
{ 
    var test = new Order() 
    { 
     Id = Guid.NewGuid(), 
     Title = "Test", 
     Code = new Code("O-123456789") // TODO create a Code.NewCode() later 
    }; 
    var line = Newtonsoft.Json.JsonConvert.SerializeObject(test).ToString(); 
    Console.WriteLine(line); 
} 

// Define other methods and classes here 
public class Order 
{ 
    public Guid Id { get; set; } 
    public Code Code { get; set; } 
    public string Title { get; set; } 
} 

public class Code 
{ 
    public string code; 

    public Code(string code) 
    { 
     this.code = code; 
    } 
} 

私はこの結果を得る:

{"Id":"227599fe-c834-4330-84e5-2018abe59e35","Code":{"code":"O-123456789"},"Title":"Test"} 

をしかし、私はこれ欲しい:

{"Id":"227599fe-c834-4330-84e5-2018abe59e35","Code":"O-123456789","Title":"Test"} 

を、どのように私が私のコードの種類を強制することができます私が望むようにシリアル化する。実際、Guid()の同じ動作が必要です。または、String()を実装する方法を見つけてください。これで私を助けてくれますか?

私はおそらくJSONのシリアル化を強制するために、いくつかの属性を使用することができますが、私はまさにのGUID(のようなすべてのシリアル化のために働く何かをしたいと思います知っている)

+1

Json.Netは、Guidの.Netプリミティブをフードの下の文字列(JSONプリミティブ)に変換します。 https://www.newtonsoft.com/json/help/html/SerializationGuide.htm –

答えて

0

たぶん、あなたはこのようにそれを行うことができます。

public class Order 
    { 
     public Guid Id { get; set; } 

     [JsonIgnore] 
     public Code Code { get; set; } 

     public string SerializedCode 
     { 
      get 
      { 
       if (Code != null) 
       { 
        return Code.code; 
       } 
       return string.Empty; 
      } 
     } 

     public string Title { get; set; } 
    } 

Output : {"Id":"227599fe-c834-4330-84e5-2018abe59e35","SerializedCode":"O-123456789","Title":"Test"} 

実際には、すべてのシリアル化処理では使用できません。それを実行する一般的な方法はありません。たぶんあなたは、独自のシリアライザクラスを提供することができます。しかし、私はそれが良い解決策ではないと思います。シリアライズされた出力とクラスオブジェクト が互いに異なることは望ましくありません。それは別の問題を引き起こす可能性があります。クラスとプロパティを変更して実行することをお勧めします。

+0

これで、Guid()シリアライゼーションと既にフレームワーク内にあるすべてのタイプのためにどのように動作するのですか? –

+0

私は分かりません。多分、シリアライザはGuidの型を決定し、それを直列化するときに文字列に変換します。 – lucky

+0

JsonConvert.ToString(new Guid()); –

1

あなたはあなたのタイプを扱う新しいJsonConverterを作成し、あなたが好きどのようにそれをシリアライズすることができます:我々はこれを持っていたら

public class CodeSerializer : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var code = value as Code; 
     writer.WriteValue(code.code); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(Code).IsAssignableFrom(objectType); 
    } 
} 

あなたはJsonSerializerSettings上のいくつかのプロパティを設定することで、あなたのSerializeObject方法にプラグインすることができます:

var jsonSerializerSettings = new JsonSerializerSettings(); 
jsonSerializerSettings.Converters.Insert(0, new CodeSerializer()); 
var line = Newtonsoft.Json.JsonConvert.SerializeObject(test, jsonSerializerSettings).ToString(); 
Console.WriteLine(line); 
// {"Id":"2010e737-a9e8-4b77-bde6-1c50e92c6a30","Code":"O-123456789","Title":"Test"} 
0

答えはデビッド・ワットでコメントで指定されたものです。

Json.Netは.Nを変換し、 et Guidのプリミティブをフードの下の文字列(JSONプリミティブ)に変換します。 newtonsoft.com/json/help/html/SerializationGuide.htmのすべての詳細

Json.NETシリアライザは、プリミティブな.NET値をプリミティブなJSON値に変換し、.NETの配列とコレクションをJSONに変換しますJSONオブジェクトに変換します。

他のカスタムシリアル化では、Kevin Smithの説明に従ってJsonConverterを使用する必要があります。

関連する問題