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

时间:2017-05-19 09:08:56

标签: c# json serialization json.net

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

我正在接收一个json对象,它有一个字段packages,可以作为字符串数组或#34;对象"的数组进行定值。所以,在某些情况下,我有这样的事情:

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

和我有的时间:

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

在我的域类中,我尝试以这种方式定义packages字段:

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

但这似乎只有在我反序列化字符串数组时才有用。相反,当我获取对象时,我班级中的packages字段将被归类为null

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

注意:我还试图像这样定义字段:

public String packages { get; set; }

但我得到例外......

3 个答案:

答案 0 :(得分:1)

您可以使用JToken替换object

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

然后你可以yourObject.packages.First().ToString()

答案 1 :(得分:0)

问题是你试图将2种不同的输入类型反序列化为1,这不是C#喜欢的东西。 Json Parser的返回类型必须明确定义,这意味着不可能有List有时String,有时ObjectRegex

我认为处理此问题的正确方法是首先找出输入的内容,例如使用一些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; }
        }
   }

对于对象列表,请使用:

$location.path('/foo');

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

答案 2 :(得分:0)

我终于解决了实施自定义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; }

这很好......