是否有方法将JSON内容反序列化为c#动态类型?为了使用DataContractJsonSerializer,最好跳过创建一堆类。
当前回答
我来这里是为了找到。net Core的答案,没有任何第三方或其他参考。如果您将ExpandoObject与标准JsonSerializer类一起使用,那么它工作得很好。下面是一个对我有用的例子:
using System.Text.Json;
using System.Dynamic;
dynamic json = JsonSerializer.Deserialize<ExpandoObject>(jsonText);
Console.WriteLine(json.name);
这段代码输出一个name属性的字符串值,该属性存在于传递给Deserialize方法的JSON文本中。瞧——没有额外的库,什么都没有。只是。net核心。
编辑:有嵌套元素的json的几个级别可能会有问题。适用于单层平面对象。
其他回答
我需要的是返回一个带有不同字段的json模型。 我的模型是这样的,但它可以改变。
{
"employees":
[
{ "name": "Darth", "surname": "Vader", "age": "27", "department": "finance"},
{ "name": "Luke", "surname": "Skywalker", "age": "25", "department": "IT"},
{ "name": "Han", "surname": "Solo", "age": "26", "department": "credit"}
]
}
获取数据值的列表
JObject array = JObject.Parse(model.JsonData);
var tableData = new List<JsonDynamicModel>();
foreach (var objx in array.Descendants().OfType<JProperty>().Where(p => p.Value.Type != JTokenType.Array && p.Value.Type != JTokenType.Object))
{
var name = ((JValue)objx.Name).Value;
var value = ((JValue)objx.Value).Value;
if (tableData.FirstOrDefault(x => x.ColumnName == name.ToString()) == null)
{
tableData.Add(new JsonDynamicModel
{
ColumnName = name.ToString(),
Values = new List<string> { value.ToString() },
});
}
else
{
tableData.FirstOrDefault(x=>x.ColumnName == name.ToString()).Values.Add(value.ToString());
}
}
输出如下所示。然后我把结果模型转换成一个html表,我用这个方法创建了一个html表
// output
tableData[0].ColumnName -> "name";
tableData[0].Values -> {"Darth", "Luke", "Han" }
tableData[1].ColumnName -> "surname";
tableData[1].Values -> {"Vader", "Skywalker", "Solo" }
...
看看我在CodeProject上写的一篇文章,它准确地回答了这个问题:
使用JSON的动态类型。网
这里有太多的内容需要重新发布,甚至更没有意义,因为那篇文章有一个带有密钥/所需源文件的附件。
另一种方法是使用Newtonsoft。Json:
dynamic stuff = Newtonsoft.Json.JsonConvert.DeserializeObject("{ color: 'red', value: 5 }");
string color = stuff.color;
int value = stuff.value;
JsonFx可以将JSON内容反序列化为动态对象。
序列化动态类型(.NET 4.0的默认值):
var reader = new JsonReader(); var writer = new JsonWriter();
string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";
dynamic output = reader.Read(input);
Console.WriteLine(output.array[0]); // 42
string json = writer.Write(output);
Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}
.NET 4.0有一个内置库可以做到这一点:
using System.Web.Script.Serialization;
JavaScriptSerializer jss = new JavaScriptSerializer();
var d = jss.Deserialize<dynamic>(str);
这是最简单的方法。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- 查询JSON类型内的数组元素
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 将JSON字符串转换为HashMap
- 将JsonNode转换为POJO