21

JSON データを含む文字列があることを JSON.NET に伝えることはできますか? たとえば、次のようなクラスがあります。

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

私はこのように使用します:

var foo = new Foo();
foo.Id = 5;
foo.RawData = @"{""bar"":42}";

私はこのようにシリアライズしたい:

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

基本的に、構造化されていない可変長データが既に JSON として保存されています。このデータを一部として含めるには、完全にシリアル化されたオブジェクトが必要です。

ありがとう。

編集: 正しく理解されていることを確認するために、これは一方向のシリアル化です。つまり、同じオブジェクトに逆シリアル化する必要はありません。他のシステムはこの出力を処理します。RawData のコンテンツを単なる文字列ではなく、JSON の一部にする必要があります。

4

3 に答える 3

23

これを行うにはコンバーターが必要です。例を次に示します。

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; }
   }   
}

次に、それを使用してクラスを装飾します。

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

次に、使用する場合:

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

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

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

それが役に立てば幸い

編集:より効率的なソリューションのために回答を更新しました。以前のソリューションでは、シリアライズしてからデシリアライズする必要がありましたが、そうではありません。

于 2013-07-11T19:15:02.693 に答える
4

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

public class Foo
{
    public int Id;
    public string RawData;
    private object thisObject;
    public object ThisObject 
    {
        get
        {
            return thisObject ?? (thisObject = JsonConvert.DeserializeObject<object>(RawData));
        }
    }        
}
于 2015-01-29T02:17:14.810 に答える