解析json时如何将字符串创建为集合

Kameiliduo Kameiliduo

我正在尝试访问 API 并通过邮递员获得以下响应正文:

{
    "Name": "wangxiaoer",
    "Created": "2018-01-26T01:28:19.0388857Z",
    "Modified": "2019-06-18T03:46:52.4350569Z",
    "AdminSecurityGroups": "mhanch;sastrys;vinala;vballa",
    "DeveloperOwner": "sastrys;vballa",
    "ProgramManagerOwner": "sastrys",
    "Comments": null
}

我使用了以下代码:

var content = await httpResponse.Content.ReadAsStringAsync();

获取响应体

我想将此内容反序列化为如下所示的自定义对象:

class MyObject
{
   public string Name{get;set}

   [JsonProperty(PropertyName = "AdminSecurityGroups")]
   public List<String> Admins { get; set; }

   [JsonProperty(PropertyName = "DeveloperOwner")]
   public List<String> DevOwner { get; set; }

   [JsonProperty(PropertyName = "ProgramManagerOwner")]
   public List<String> PMOwner { get; set; }
}

由于响应内容为我提供了每个字符串,这些字符串通过用 ';' 分割而由多个人的别名组成。对于 AdminSecurityGroups、DeveloperOwner、ProgramManagerOwner,因此最好将每个字符串转换为列表以便以后重用。我试图在对象中定义一个列表,而不是使用 String 来存储这些部分中的每一个,但是当我使用

MyObject my = JsonConvert.DeserializeObject<MyObject>(content);

它抛出异常。有没有办法在使用c#解析json字符串时实现将字符串转换为列表。例如:

"AdminSecurityGroups": "mhanch;sastrys;vinala;vballa"

它通过拆分包含 4 个人;什么时候得到响应字符串。需要将其解析为列表。

将军

你可以通过多种方式做到这一点,

  1. 规范化你的 json,json 有数组....

  2. 反序列化为字符串,然后使用另一个属性将其拆分,或映射到另一个属性。

  3. 只需使用专为此类情况而设计的转换器

JSON.Net

public class MyObject
{
   public string Name{get; set; }

   [JsonProperty( "AdminSecurityGroups")]
   [JsonConverter(typeof(MyFunkConverter))]
   public List<string> Admins { get; set; }

   [JsonProperty( "DeveloperOwner")] 
   [JsonConverter(typeof(MyFunkConverter))]
   public List<string> DevOwner { get; set; }

   [JsonProperty( "ProgramManagerOwner")]
   [JsonConverter(typeof(MyFunkConverter))]
   public List<string> PMOwner { get; set; }
}

public class MyFunkConverter : JsonConverter<List<string>>
{
   public override void WriteJson(JsonWriter writer, List<string> value, JsonSerializer serializer)
      => throw new NotImplementedException(); 
   public override List<string> ReadJson(JsonReader reader, Type objectType, List<string> existingValue, bool hasExistingValue, JsonSerializer serializer) =>
      reader.Value.ToString().Split(';').ToList();
}

...

var result =  JsonConvert.DeserializeObject<MyObject>(input); 

文本.Json

public class MyObject
{
   public string Name{get; set; }

   [JsonPropertyName("AdminSecurityGroups")]
   [JsonConverter(typeof(MyFunkConverter))]
   public List<string> Admins { get; set; }

   [JsonPropertyName("DeveloperOwner")]
   [JsonConverter(typeof(MyFunkConverter))]
   public List<string> DevOwner { get; set; }

   [JsonPropertyName( "ProgramManagerOwner")]
   [JsonConverter(typeof(MyFunkConverter))]
   public List<string> PMOwner { get; set; }
}

public class MyFunkConverter : System.Text.Json.Serialization.JsonConverter<List<string>>
{
   public override List<string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) 
      => reader.GetString().Split(';').ToList();
   public override void Write(Utf8JsonWriter writer, List<string> value, JsonSerializerOptions options) 
      => throw new NotImplementedException();
}

...

var result =  JsonSerializer.Deserialize<MyObject>(input);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章