将JSON字符串转换为对象C#

时间:2019-05-16 05:56:07

标签: c# json

我有JSON字符串结果,如下所示。 enter image description here

在此响应中,有时会将sizeKey和sizeName属性作为字符串返回。但是有时两个属性都在数组内返回,如下所示 enter image description here

我正在使用以下代码将其转换为对象

var assets = jObject["assets"].Children().ToList();
            foreach (var item in assets)
            {
                decorationAssets.Add(item.ToObject<AEDecorationAssets>());
            }

我的AEDecorationAssets类如下。

public class AEDecorationAssets
{
    public string Id { get; set; }
    public string Url { get; set; }
    public string[] Colors { get; set; }
    public string FontKey { get; set; }
    public string SizeKey { get; set; }
    public string ViewKey { get; set; }
    public string FontName { get; set; }
    public int Rotation { get; set; }
    public string SizeName { get; set; }
    public string TextValue { get; set; }
    public string EntityType { get; set; }
    public string LocationCode { get; set; }
    public string LocationName { get; set; }
    public string TextEffectKey { get; set; }
    public string TextEffectName { get; set; }
    public string DecorationMethod { get; set; }
    public string NumDecorationColors { get; set; }
}

当“ sizeKey”是一个数组时,以上代码给出了一个错误。我该如何解决这个问题?我们可以使用任何JSON属性来解决它吗?

3 个答案:

答案 0 :(得分:3)

一种方法是通过使SizeKey键入object(即public object SizeKey { get; set; }),然后打开/设置item.ToObject<AEDecorationAssets>().SizeKey.GetType()来找出来处理它(例如,如果String这样做,如果JArray这样做),等等。

答案 1 :(得分:0)

如果JSON类型有时是array,有时是string,则不能真正将其简单地映射到.NET类型,因为没有一种支持这种行为。

因此,首先需要一个可以存储此数据的数据类型,例如string[]List<string>

JsonConvert可能会自动解决此问题,但是否则,您需要编写自定义的ContractResolverJsonConverter。在这里,您可以检测source属性是字符串还是数组。如果它是array,则可以使用默认的反序列化。如果它是string,则需要将其转换为具有单个值的数组。

答案 2 :(得分:0)

仅获取要为其创建c#对象的json结果,然后可以从https://jsonlint.com/验证json响应,然后可以通过http://json2csharp.com创建想要的任何类型的json响应的c#对象。在获取json响应的c#对象之后,您只需要将json响应反序列化为已创建的c#对象即可。这将返回您的预期结果。