c# - 两种类型的变量

标签 c# json typescript json-deserialization

我需要从 TypeScript 中读取一个 JSON 对象,它有一个变量名 prop 两种类型,IdentifierExpression 到C#。 TypeScript 可以有一个具有多种类型的变量(具有联合类型特性),例如,prop 定义为

var property:Identifier | Expression

我正在使用 JsonConvert.DeserializeObject 从 C# 读取 JSON 对象字符串,例如,

Object facebookFriends = new JavaScriptSerializer().Deserialize<Object>(JSON_Object);

我应该如何在C#中声明两种类型的变量?或者我应该只使用 object(即声明为 Object property)?

最佳答案

如果属性可以有这两种格式之一:

{ "prop": "identifier" }
{ "prop": { "complex": "object" } }

即。无论是简单的字符串还是更复杂的对象,您都可以通过使用 dynamic 来接受解析的 prop 值,并使用额外的属性来返回标识符或复杂对象来解决这个问题。这是一个 LINQPad演示的程序:

void Main()
{
    var jsonStrings = new[]
    {
        "{ \"prop\": \"identifier\" }",
        "{ \"prop\": { \"complex\": \"object\" } }"
    };

    jsonStrings.Select(json => JsonConvert.DeserializeObject<Test>(json)).Dump();
}

public class Test
{
    public Test()
    {
        _Complex = new Lazy<Complex>(GetComplex);
    }

    [JsonProperty("prop")]
    public dynamic prop { get; set; }

    [JsonIgnore]
    public string Identifier => prop as string;

    private readonly Lazy<Complex> _Complex;

    [JsonIgnore]
    public Complex Complex => _Complex.Value;

    private Complex GetComplex()
    {
        if (!(prop is JObject))
            return null;

        return ((JObject)prop).ToObject<Complex>();
    }
}

public class Complex
{
    public string complex { get; set; }
}

输出:

example output

另一种方法是创建您自己的类型来处理多个输出,并再次使用辅助属性来评估您从 json 中实际获得的内容:

void Main()
{
    var jsonStrings = new[]
    {
        "{ \"prop\": \"identifier\" }",
        "{ \"prop\": { \"complex\": \"object\" } }"
    };

    jsonStrings.Select(json => JsonConvert.DeserializeObject<Test>(json)).Dump();
}

public class Test
{
    [JsonProperty("prop")]
    public dynamic prop { get; set; }

    [JsonIgnore]
    public PropertyValue Property
    {
        get
        {
            if (prop is string)
                return new IdentifierProperty(prop as string);
            return new ExpressionProperty(((JObject)prop).ToObject<Expression>());
        }
    }
}

public abstract class PropertyValue
{
}

public class IdentifierProperty : PropertyValue
{
    public IdentifierProperty(string identifier)
    {
        Identifier = identifier;
    }

    public string Identifier { get; }

    public override string ToString() => Identifier;
}

public class ExpressionProperty : PropertyValue
{
    public ExpressionProperty(Expression expression)
    {
        Expression = expression;
    }

    public Expression Expression { get; }

    public override string ToString() => Expression.ToString();
}

public class Expression
{
    public string complex { get; set; }

    public override string ToString() => $"complex: {complex}";
}

输出:

second example output

关于c# - 两种类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34395609/

相关文章:

javascript - 将特定的 JSON 数组存储在变量中

c# - 如何序列化包含结构列表的类的对象列表

javascript - TypeScript 启动一个空接口(interface)对象

联合中不存在 Typescript 属性

用大括号包裹的 typescript 返回值?

c# - PrintFixedDocument wpf 打印质量- Windows 10/8 与 Windows 7

javascript - JSON.stringify 将 Infinity 转换为 null

c# - 在 ZedGraph 中显示 Y 轴线

C# 将字符串转换为字典

c# - 谷歌客户端登录授权和谷歌音乐