我有一个JSON
字符串,可以在其中更改记录。我在JSON字符串中使用的每个级别都使用public partial classes
。我将其复制到DataTable
,因为我的SQL Server中需要它。我这样叫JSON:
StringReader sr = new StringReader(json);
Newtonsoft.Json.JsonTextReader readera = new JsonTextReader(sr);
object result = (Welcome)jsona.Deserialize(readera,typeof(Welcome));
Welcome w = (Welcome)result;
DataTable da = w.Result.Records.ToDataTable();
例如,我的JSON
可以包含:
ID,名称,值
但是其他JSON
可能包含:
ID,地址,城市,邮政编码
我的班级现在看起来像这样:
public partial class Record
{
[JsonProperty("Col1")]
public DateTimeOffset Col1 { get; set; }
[JsonProperty("Col2")]
public long Col2 { get; set; }
[JsonProperty("Col3")]
public DateTimeOffset Col3 { get; set; }
[JsonProperty("Col4")]
public long Col4 { get; set; }
[JsonProperty("Col5")]
public string Col5 { get; set; }
我将如何使其动态?我真的没有头绪。
答案 0 :(得分:1)
您可以使用print("foo") # raises exception
print "foo" # doesn't work either
print # doesn't raise any exception, but I want it to
foo = print # this shouldn't work either like the one above, but it does
数据类型代替类。这里的示例使用dynamic
Json.net
答案 1 :(得分:1)
您可以通过string
创建一个类,并在运行时对其进行编译和加载,并通过反射来设置值。
在此示例中,我将新类简化为一个属性。
public Type BuildType(string propertyName)
{
var code = @"
using System;
namespace MyNamespace
{
public class MyClass
{
public object " + propertyName + @" { get; set; }
}
}";
var provider = new CSharpCodeProvider();
var parameters = new CompilerParameters
{
GenerateInMemory = true,
GenerateExecutable = false
};
var results = provider.CompileAssemblyFromSource(parameters, code);
// Check Errors
if (results.Errors.HasErrors)
{
var sb = new StringBuilder();
foreach (CompilerError error in results.Errors)
{
sb.AppendLine(string.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
}
throw new InvalidOperationException(sb.ToString());
}
var assembly = results.CompiledAssembly;
var classInstance = assembly.GetType("MyNamespace.MyClass");
return classInstance;
}