1

JsonConvert.SerializeObjectを JSON オブジェクトとして扱うように指示するにはどうすればよいですかUserPreferences(文字列としてデータベースに格納されます)。

  public int UserId { get; private set; }

  [[JsonProperty something]]
  public string UserPreferences { get; private set; }

  public CFUser(Int32 userId, string userPreferences) {
      UserId = userId;
      UserPreferences = userPreferences;
  }
4

1 に答える 1

2

問題に対処するオプションはJsonConverterUserPreferencesプロパティにカスタムを使用することです。そのためには、次の属性でプロパティを装飾する必要があります。

[JsonConverter(typeof(UserPreferencesConverter))]
public string UserPreferences { get; private set; }

完全なサンプルは次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        var cfUser = new CFUser(1, @"{""test"":""ok""}");
        var json = JsonConvert.SerializeObject(cfUser);
        var deserialized = JsonConvert
            .DeserializeObject(json, typeof(CFUser));
    }

}

class UserPreferencesConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(
        JsonReader reader, Type objectType, 
        object existingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);

        // you may use the following line instead
        //return jObject.ToString().Replace("\r\n", "");

        return jObject.ToString()
            .Where(c => !"\r\n".Contains(c))
            .Aggregate<char, string>("", (s, c) => s + c);
    }

    public override void WriteJson(JsonWriter writer, 
        object value, JsonSerializer serializer)
    {
        writer.WriteRawValue(value.ToString());
    }
}

public class CFUser
{
    public int UserId { get; private set; }

    [JsonConverter(typeof(UserPreferencesConverter))]
    public string UserPreferences { get; private set; }

    public CFUser(Int32 userId, string userPreferences)
    {
        UserId = userId;
        UserPreferences = userPreferences;
    }
}
于 2013-02-27T11:33:24.270 に答える