2013-07-11 12 views
13

JSONデータにJSONデータが含まれていると伝えることはできますか?例えば。私はこのようなクラスている:JSON.NET:JSONオブジェクトへのjson文字列プロパティのシリアル化

私はこのようなシリアル化する必要
var foo = new Foo(); 
foo.Id = 5; 
foo.RawData = @"{""bar"":42}"; 

:私はこのような使用

public class Foo 
{ 
    public int Id; 
    public string RawData; 
} 

基本的に私は、非構造化の一片を

{"Id":5,"RawData":{"bar":42}} 

を持っていますJSONとして既に格納されている可変長データを使用するには、このデータを一部として保持するために完全にシリアル化されたオブジェクトが必要です。

ありがとうございました。

EDIT:正しく理解されているかどうかを確認するために、これは一方向のシリアル化です。つまり、同じオブジェクトにデシリアライズする必要はありません。他のシステムはこの出力を処理する。私はRawDataの内容が単なる文字列ではなくJSONの一部である必要があります。あなたが使用する場合、次に

public class Foo 
{ 
    public int Id; 
    [JsonConverter(typeof(RawJsonConverter))] 
    public string RawData; 
} 

public class RawJsonConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteRawValue(value.ToString()); 
    } 

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

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

    public override bool CanRead 
    { 
     get { return false; } 
    } 
} 

そして、それをあなたのクラスを飾る:

+0

を参照してくださいJRawを使用すると、よりsutableとcomapct解決策になる可能性があること、可能であるはい、それは可能ですが、あなたはあなたが必要とする出力が正確に何である私に言うことができますか?現在は:{"ID":5、 "RawData": "{\" bar \ ":42}"} –

+0

@リバーズ、これは私が必要とするものです。私はJSONコンテンツを持つ文字列プロパティを持っています。JSONコンテンツを直列化してJSONに戻すのは無駄です。 – port443

+0

@リバーズ、申し訳ありませんが、私はあなたの例を十分に読んでいませんでした。あなたのケースでは、JSONのRawDataの内容は文字列です。サブオブジェクトにする必要があります(つまり、バリアントに余分な引用符とバックスラッシュが追加されています)。 – port443

答えて

16

は、あなたがそれを行うには、コンバータを必要とし、ここでは一例である

var json = JsonConvert.SerializeObject(foo, 
            new JsonSerializerSettings()); 
Console.WriteLine (json); 

これはあなたの出力です:

{"Id":5,"RawData":{"bar":42}} 

はそれが役に立てば幸い

編集:私は、より効率的なソリューションのための私の答えを更新した、前回の1はこれがない場合、デシリアライズにシリアル化するためにあなたを余儀なくされました。

+0

自分で試してみる必要がありますが、 @河川。 – port443

0

他のプロパティを使用して、オブジェクトプロパティjsonを逆シリアル化することができます。

public class Foo 
{ 
    public int Id; 
    public string RawData; 
    private object thisObject; 
    public object ThisObject 
    { 
     get 
     { 
      return thisObject ?? (thisObject = JsonConvert.DeserializeObject<object>(RawData)); 
     } 
    }   
} 
関連する問題