【问题标题】:How to serialize json string value to class in Newtonsoft Json如何在Newtonsoft Json中将json字符串值序列化为类
【发布时间】:2020-04-14 13:05:35
【问题描述】:

如果我有以下模型类

public class User
{
    public string Name {get; set;}
    public string UUID {get; set;}
}

以下 JSON 字符串将被正确转换

// JSON 1
{
  "User": {
    "Name": "Hello World",
    "UUID": "000000-00000-00000"
  }
}

在我的情况下,有时我有以下 JSON JSON 2 User JSON 属性代表 UUID 值而不是用户模型对象

// JSON 2
{
  "User": "000000-00000-00000"
}

我想使用User 类作为ASP.Net Core 动作参数模型,这意味着我可能需要自定义JsonConverter

有什么办法可以把上面的JSON字符串转成UserClass吗?

【问题讨论】:

    标签: c# asp.net-core json.net


    【解决方案1】:

    试试这个:

    class UserJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType) => objectType == typeof(User);
    
        public override bool CanWrite => false;
    
        public override object ReadJson(JsonReader reader, Type objectType, 
            object existingValue, JsonSerializer serializer)
        {
            var token = JToken.ReadFrom(reader);
            if (token.Type == JTokenType.Null)
            {
                return null;
            }
    
            var user = new User();
            // Convert string
            if (token.Type == JTokenType.String)
            {
                user.UUID = token.Value<string>();
            }
            // Convert object
            else
            {
                serializer.Populate(token.CreateReader(), user);
            }
    
            return user;
        }
    
        public override void WriteJson(JsonWriter writer, object value,
            JsonSerializer serializer)
        {
        }
    }
    

    这适用于:

    [JsonConverter(typeof(UserJsonConverter))]
    public class User
    {
        public string Name { get; set; }
        public string UUID { get; set; }
    }
    
    var obj = JsonConvert.DeserializeObject<MyClass>(
    @"{
      ""User"": {
        ""Name"": ""Hello World"",
        ""UUID"": ""000000-00000-00000""
      }
    }");
    
    var obj2 = JsonConvert.DeserializeObject<MyClass>(
    @"{
      ""User"": ""000000-00000-00000""
    }");
    

    【讨论】:

      【解决方案2】:

      自定义一个 JsonConverter,如下所示:

      public class UserJsonConverter:JsonConverter
      {
          public override bool CanConvert(Type objectType) => objectType == typeof(User);
      
          public override bool CanWrite => false;
      
          public override object ReadJson(JsonReader reader, Type objectType,
              object existingValue, JsonSerializer serializer)
          {
              var token = JToken.ReadFrom(reader);
              if (token.Type == JTokenType.Null)
              {
                  return null;
              }
      
              var user = new User();
      
              // Convert object
              if (token.SelectToken("User").HasValues)
              {
                  user.Name = token.SelectToken("User.Name").ToString();
                  user.UUID = token.SelectToken("User.UUID").ToString();
              }
              // Convert string
              else
              {
                  user.UUID = token.SelectToken("User").ToString();
              }
      
              return user;
          }
      
          public override void WriteJson(JsonWriter writer, object value,
              JsonSerializer serializer)
          {
          }
      }
      

      结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        相关资源
        最近更新 更多