JSON.NET: Serialize json string свойство в json-объект

Можно ли рассказать JSON.NET У меня есть строка с данными JSON? Например, у меня есть класс вроде этого:

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, мне нужен полностью сериализованный объект, чтобы содержать эти данные как часть.

Благодарю.

EDIT: просто чтобы убедиться, что это правильно понято, это односторонняя сериализация, то есть мне не нужно ее десериализовать обратно на тот же объект; другая система должна обрабатывать этот вывод. Мне нужно, чтобы RawData был частью JSON, а не простой строкой.

Ответ 1

Для этого вам нужен конвертер, вот пример:

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

Надеюсь, поможет

Изменить: я обновил свой ответ для более эффективного решения, предыдущий заставил вас сериализовать, чтобы затем десериализовать, это не так.

Ответ 2

Возможно, что использование JRaw может быть более доступным и компактным решением

посмотреть это сообщение

Ответ 3

Вы можете использовать другое свойство для десериализации свойства объекта json.

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