繁体   English   中英

使用Newtonsoft Json反序列化动态结构

[英]Deserialize dynamic structure with Newtonsoft Json

尝试在应用程序中反序列化“动态” JSON结构时遇到一些问题。

我收到了一个json对象,它具有一个字段packages ,可以将其值化为字符串数组或“对象”数组。 因此,在某些情况下,我会遇到以下情况:

"packages" : [ "Test", "Var" ]

和一些我有:

"packages" : [ {
    "id" : "9",
    "name" : "Test"
},
{
    "id" : "19",
    "name" : "Opt"
}]

在域类中,我尝试通过以下方式定义包字段:

public List<object> packages { get; set; }

但这似乎仅在我反序列化字符串数组时有效。 相反,当我获取对象时,班级中的packages字段被标为null

我该如何解决这个问题? 我是否可以仅对packages fileld避免反序列化,并以简单字符串的形式获取值?

注意 :我也尝试定义如下字段:

public String packages { get; set; }

但我要例外了...

您可以使用JToken替换object

public class [YourClassName]
{
    public List<JToken> packages { get; set; }
}

那么你可以yourObject.packages.First().ToString()

问题是您试图将2种不同的输入类型反序列化为1,这是C#所不喜欢的。 Json Parser的返回类型必须定义良好,这意味着不可能有一个List有时带有一个String ,有时还有一些Object

我认为处理此问题的正确方法是,首先通过使用一些Regex表达式来找出输入内容。 找到输入的外观后,使用Json解析器将输入解析为适合您输入的对象。

有关字符串列表,请使用:

class ParsedStrings {
    public List<String> Packages { get; set; }
}

对于对象列表,请使用:

   class ParsedObjects {
        public List<IdName> Names { get; set; }

        public class IdName {
             public string Id { get; set; }
             public string Name { get; set; }
        }
   }

由于您使用的是强类型语言,因此此输入的格式并不正确。 您应该考虑使用其他语言来匹配您的问题,或者更改输入以更好地适应您的环境。

我终于解决了实现自定义JsonConverter

public class PackagesConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;

        List<string> res = new List<string>();

        var jsonArray = JArray.Load(reader);
        foreach (var i in jsonArray)
        {
            if (i.Count() > 1)
            {
                var name = i["name"];
                res.Add(name.ToString());
            }
            else
            {
                res.Add(i.ToString());

            }
        }
        return res;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

并将其应用于我的领域:

[JsonConverter(typeof(PackagesConverter))]
public List<String> packages { get; set; }

一切正常...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM