2013-07-11 23 views
13

Czy można powiedzieć JSON.NET, że mam ciąg znaków z danymi JSON? Na przykład. Mam klasy jak poniżej:JSON.NET: Serialize właściwości łańcucha json w obiekcie json

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

których używam tak:

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

którym chcę być szeregowane tak:

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

Zasadniczo mam kawałek niestrukturalnych Dane o zmiennej długości przechowywane jako JSON już, potrzebuję w pełni serializowanego obiektu do przechowywania tych danych jako części.

Dzięki.

EDYCJA: Tylko po to, aby upewnić się, że jest poprawnie zrozumiany, jest to jednostronna serializacja, tj. Nie jest potrzebna do deserializacji z powrotem do tego samego obiektu; drugi system będzie przetwarzał dane wyjściowe. Potrzebuję zawartości RawData, aby być częścią JSON, a nie zwykłym ciągiem znaków.

+0

tak to jest możliwe, ale możesz mi powiedzieć dokładnie to, co jest potrzebne wyjście? obecnie jest: {"Id": 5, "RawData": "{\" bar \ ": 42}"} –

+0

@Rivers, to jest dokładnie to, czego potrzebuję. Mam właściwość string z zawartością JSON, która moim zdaniem jest bezużyteczna do deserializacji tylko w celu serializacji z powrotem do JSON. – port443

+0

@Rivers, przepraszam, nie przeczytałem twojego przykładu wystarczająco dobrze. W twoim przypadku zawartość RawData w JSON jest łańcuchem, potrzebuję go jako sub-obiektu (np. Twój wariant ma dodatkowe cytaty i ukośniki dodane: – port443

Odpowiedz

16

potrzebny jest konwerter, aby to zrobić, oto przykład:

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

Następnie udekorować swoją klasę z nim:

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

Potem, kiedy użyć:

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

To jest Twoje wyjście:

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

Nadzieja pomaga

Edit: I zostały zaktualizowane moją odpowiedź na bardziej efektywne rozwiązania, poprzedni zmuszony do serializacji aby następnie deserializowania, to nie.

+0

Muszę spróbować sam, ale wygląda na to, że rozwiązuje mój problem. @Rivers. – port443

0

Można użyć innej właściwości do deserializacji właściwości json obiektu.

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

Jest możliwe, że za pomocą JRaw może być bardziej sutable i comapct rozwiązanie

zobaczyć this post

Powiązane problemy