我需要从 TypeScript 中读取一个 JSON 对象,它有一个变量名 prop
两种类型,Identifier
或 Expression
到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; }
}
输出:
另一种方法是创建您自己的类型来处理多个输出,并再次使用辅助属性来评估您从 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}";
}
输出:
关于c# - 两种类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34395609/