为了账号安全,请及时绑定邮箱和手机立即绑定

Json将字符串转换为Collection

Json将字符串转换为Collection

PHP
开心每一天1111 2021-04-29 14:11:08
我从API获取此json格式:"url_service": "","Description": null,"Target": "5,6","Category ": "2"我正在尝试将json反序列化为模型。问题出在“目标”字段,该字段应该是int的ICollection。这是我的模型:public string Description{ get; set; }public ICollection<int> Target{ get; set; }public int Category { get; set; }有没有一种方法可以在序列化Json之前处理Json,以便从逗号分隔的字符串中进行收集?
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

与其尝试更改反序列化逻辑,不如不让它变得更简单,而仅在模型中包含一个新属性?


public string Description{ get; set; }

public int Category { get; set; }


//Change this back to string, since that is what your JSON is

public string Target{ get; set; }


//Add a "TargetList" property that just reads from "Target" and turns into a List

public List<int> TargetList => Target.Split(',').Select(x => int.Parse(x)).ToList();

请注意,我的代码中没有错误处理,因此您将必须进行相应的修改。


查看完整回答
反对 回复 2021-05-15
?
慕容森

TA贡献1853条经验 获得超18个赞

Target字段在json中为字符串类型,因此序列化程序将尝试将其读取为字符串。您可以使用转换器来推翻它,例如使用Newtonsoft Json。


假设您的数据结构定义如下:


public class Data {

    public string Description{ get; set; }

    public ICollection<int> Target{ get; set; }

    public int Category { get; set; }

}

然后,您可以创建自己的JsonConverter,如下所示:

public class DataConverter : JsonConverter {


    public override bool CanWrite => false;


    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {

        throw new NotImplementedException();

    }


    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {


        var jObject = JObject.Load(reader);


        var data = new Data();


        if (jObject.TryGetValue("Description", out JToken jDescription)) {

            data.Description = jDescription.Value<string>();

        }

        if (jObject.TryGetValue("Target", out JToken jTarget)) {

            data.Target = ToTarget(jTarget, serializer);

        }

        if (jObject.TryGetValue("Category", out JToken jCategory)) {

            data.Category = jCategory.Value<int>();

        }


        return req;


    }


    private static ICollection<int> ToTarget( JToken jTarget, JsonSerializer serializer ) {


        int defaultValue = -1;

        var target = new List<int>();

        var collection = jTarget.Value<string>().Split(',');

        foreach (string str in collection)

            if (int.TryParse(str, out int number))

                target.Add(number);

            else

                target.Add(defaultValue);


        return target;


    }


    public override bool CanConvert(Type objectType) => objectType == typeof(Data);


}

然后,您可以使用以下代码反序列化:


var jsonSettings = new JsonSerializerSettings();

jsonSettings.Converters.Add(new DataConverter);

Data data = JsonConvert.DeserializeObject<Data>(yourJsonString, jsonSettings);

进一步考虑:这种方法可以使您的数据定义和数据解析逻辑之间清楚地分开,从而使您的数据结构和定义与任何json特定的信息和解析逻辑保持清晰。


查看完整回答
反对 回复 2021-05-15
  • 3 回答
  • 0 关注
  • 249 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信