我需要将复杂的JSON blob反序列化为标准的.NET容器,以便在不了解JSON的代码中使用.它期望的事情是在标准的.NET类型,具体地Dictionary<string, object>或List<object>其中"对象"可以是原语或递归(词典或列表).
我不能使用静态类型来映射结果,并且JObject/JToken不适合.理想情况下,有一些方法(通过Contracts可能?)将原始JSON转换为基本的.NET容器.
我一直在寻找任何方式来哄骗JSON.NET反序列化器在遇到"{}"或"[]"时创建这些简单类型,但收效甚微.
任何帮助赞赏!
我有这个字符串:
[{ "processLevel" : "1" , "segments" : [{ "min" : "0", "max" : "600" }] }]
Run Code Online (Sandbox Code Playgroud)
我正在反序列化该对象:
object json = jsonSerializer.DeserializeObject(jsonString);
Run Code Online (Sandbox Code Playgroud)
该对象看起来像:
object[0] = Key: "processLevel", Value: "1"
object[1] = Key: "segments", Value: ...
Run Code Online (Sandbox Code Playgroud)
并尝试创建一个字典:
Dictionary<string, object> dic = json as Dictionary<string, object>;
Run Code Online (Sandbox Code Playgroud)
但dic得到null.
可能是什么问题?
我有一个复杂的对象图,我正在使用Json.NET序列化/反序列化.一些对象派生自抽象类,因此为了使反序列化正常工作,我需要创建一个自定义JsonConverter.它唯一的作用是在反序列化时选择抽象类的适当具体实现,并允许Json.NET继续运行.
当我想序列化时,我的问题出现了.我根本不需要做任何自定义.我想获得完全相同的行为,因为JsonConvert.SerializeObject没有自定义JsonConverter.
但是,由于我使用自定义JsonConverter类来满足反序列化需求,因此我不得不提供WriteJson实现.由于WriteJson是抽象的,我不能只是调用base.WriteJson,但我想基本上这样做.所以我的问题是,我该用什么方法来获得普通的Jane,默认行为?换一种说法:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// What goes here to get default processing?
}
Run Code Online (Sandbox Code Playgroud) 我对执行 JSON 转换感兴趣并研究使用 dotliquid。
为了避免输入 JSON 的 POCO 只是为了能够将其作为变量发送,我想发送反序列化的 JSON。根据我的理解,我们无法向 render 方法发送动态,并且 JObject 或 JArray 无法按预期工作。我尝试反序列化为 Dictionary<string, object>,但无法处理嵌套的 JSON 结构。
液体
[
{%- for p in data.names -%}
{
"name" : {{ p.name }}
} {%- unless forloop.Last == true -%},{% endunless %}
{%- endfor -%}
]
Run Code Online (Sandbox Code Playgroud)
C# 代码
Template template = Template.Parse(File.ReadAllText("Maps/account.liquid"));
var json = JsonConvert.DeserializeObject<Dictionary<string, object>>(
@"{ ""names"":[{""name"": ""John""},{""name"":""Doe""}] }");
var jsonHash = Hash.FromAnonymousObject(new { Data = json});
Run Code Online (Sandbox Code Playgroud)
输出
[
{
"name" :
},
{
"name" :
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 Web API 将 Hot Chocolate(GraphQL) 添加到现有 ASP.Net Core 项目,并重用 Web API 使用的模型。其中一个模型具有 IDictionary<string, object> 属性,该属性通过 Web API 序列化为动态 JSON。
该模型
public class Theme
{
...
public IDictionary<string, object> Styles { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
使用 Web API 可以序列化为
{
...
styles: {
header: {
color: "#fff",
background: "rgba(255, 255, 255, 0)",
boxShadow: "", position: "fixed"},
...
},
borderRadius: "4px",
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
对于 Hot Chocolate,我重用了模型并在启动时添加了 GraphQL
services.AddGraphQL(sp => SchemaBuilder.New()
.AddServices(sp)
.AddQueryType(d => d.Name("Query"))
...
.AddType<Theme>()
.Create());
Run Code Online (Sandbox Code Playgroud)
生成的模式变为 …