2013-07-11 54 views
13

Có thể nói JSON.NET tôi có một chuỗi có dữ liệu JSON không? Ví dụ. Tôi có một lớp học như thế này:JSON.NET: Serialize thuộc tính chuỗi json thành đối tượng json

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

mà tôi sử dụng như thế này:

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

mà tôi muốn được tuần tự như thế này:

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

Về cơ bản tôi có một mảnh không có cấu trúc dữ liệu có độ dài thay đổi được lưu trữ dưới dạng JSON, tôi cần đối tượng được tuần tự hoàn toàn để chứa dữ liệu này như một phần.

Cảm ơn.

CHỈNH SỬA: Chỉ để đảm bảo rằng nó được hiểu đúng, đây là tuần tự hóa một chiều, nghĩa là tôi không cần nó để deserialize trở lại vào cùng một đối tượng; hệ thống khác sẽ xử lý đầu ra này. Tôi cần nội dung của RawData là một phần của JSON, không phải là một chuỗi đơn thuần.

+0

có nó là có thể, nhưng bạn có thể cho tôi biết sản lượng gì bạn cần là chính xác những gì? hiện tại là: {"Id": 5, "RawData": "{\" bar \ ": 42}"} –

+0

@ Rất tiếc, đây chính xác là những gì tôi cần. Tôi có một thuộc tính chuỗi với nội dung JSON mà tôi nghĩ là vô ích để deserialize chỉ cho mục đích serializing nó trở lại JSON. – port443

+0

@Rivers, xin lỗi, tôi đã không đọc ví dụ của bạn đủ tốt. Trong trường hợp của bạn nội dung của RawData trong JSON là chuỗi, tôi cần nó là một đối tượng phụ (tức là biến thể của bạn có thêm dấu ngoặc kép và dấu gạch chéo thêm được thêm vào. – port443

Trả lời

16

Bạn cần một bộ chuyển đổi để làm điều đó, đây là một ví dụ:

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

Sau đó, trang trí lớp học của bạn với nó:

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

Sau đó, khi bạn sử dụng:

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

Đây là sản phẩm của bạn:

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

Hy vọng nó giúp

Edit: Tôi đã cập nhật câu trả lời của tôi cho một giải pháp hiệu quả hơn, trước đó một buộc bạn serialize để sau đó deserialize, điều này thì không.

+0

Tôi sẽ phải thử nó bản thân mình, nhưng có vẻ như nó giải quyết vấn đề của tôi. @Rivers. – port443

0

Bạn có thể sử dụng thuộc tính khác để deserialize json thuộc tính đối tượng.

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

Có thể, rằng việc sử dụng JRaw có thể là sutable hơn và comapct giải pháp

thấy this post

Các vấn đề liên quan