Pytanie JSON.NET: Serialize właściwości łańcucha json do obiektu json


Czy można powiedzieć JSON.NET, że mam ciąg z danymi JSON? Na przykład. Mam taką klasę:

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

które używam w ten sposób:

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

które chcę serializować w ten sposób:

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

Zasadniczo mam kawałek nieustrukturyzowanych danych o zmiennej długości przechowywanych jako JSON już, potrzebuję w pełni serializowanego obiektu, aby zawrzeć te dane jako część.

Dzięki.

EDYCJA: Aby upewnić się, że jest poprawnie zrozumiałe, jest to jednostronna serializacja, tj. Nie potrzebuję jej 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.


14
2017-07-11 03:45


pochodzenie


tak, jest to możliwe, ale czy możesz mi powiedzieć dokładnie, jaki jest wynik, którego potrzebujesz? obecnie jest: {"Id": 5, "RawData": "{\" bar \ ": 42}"}
@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
@Rany, 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 (tzn. Twój wariant ma dodatkowe cytaty i dodatkowe ukośniki odwrotne. - port443


Odpowiedzi:


Do tego potrzebny jest konwerter, 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 udekoruj swoją klasą:

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

Następnie, gdy używasz:

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

To jest twój wynik:

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

Mam nadzieję, że to pomoże

Edytować: Zaktualizowałem swoją odpowiedź na bardziej wydajne rozwiązanie, poprzednia zmusiła cię do serializacji, aby następnie deserializować, to nie znaczy.


18
2017-07-11 19:15



Będę musiał spróbować sam, ale wygląda na to, że rozwiązuje mój problem. Dzięki @Rivers. - port443


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

widzieć ten post


3
2017-08-06 13:36





Możesz 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));
        }
    }        
}

2
2018-01-29 02:17



To rozwiązanie nie zasługuje na zero. - mavera