【发布时间】:2022-12-18 00:52:38
【问题描述】:
我有具有嵌入式数组的 JSON 对象 - 没有要反序列化的预定义强类型类。使用 Json.Net 的 ExpandoObject 反序列化有效,但数组被反序列化为列表,这对我来说是个问题。我需要带有数组的 expndoobject。是否有任何设置可以与 Json.NET 一起使用来实现此目的?
例子:
var obj = """
{
"name": "John",
"age": 18,
"grid": [
{
"type": "A",
"price": 13
},
{
"type": "B",
"price": 1
},
{
"type": "A",
"price": 17
}
]
}
""";
var engine = new Engine()
.Execute("function eval(value) { return value.grid.filter((it)=>it.type === 'A').map(it=>it.price).reduce((a,b)=>a+b) }");
dynamic v = JsonConvert.DeserializeObject<ExpandoObject>(obj, new ExpandoObjectConverter());
engine.Invoke("eval", v);
使用这个库的地方:https://github.com/sebastienros/jint 结果:
我在那里需要一个数组,否则调用将失败(“对象的属性‘过滤器’不是函数”)。
使用 dynamic v= Newtonsoft.Json.Linq.JObject.Parse(obj); 我得到了这个:
并且仍然失败:“访问的 JArray 值具有无效的键值:“过滤器”。预期为 Int32 数组索引。”
如果我为此示例定义类:
class Inner
{
public string Type { get; set; }
public int Price { get; set; }
}
class X
{
public string Name { get; set; }
public int Age { get; set; }
public Inner[] Grid { get; set; }
}
它被解析得很好(var v = JsonConvert.DeserializeObject<X>(obj);)并且代码返回我所期望的。当我使用 List<Inner> 而不是数组时,情况并非如此。因此问题是它不是一个数组。
所以我正在寻找在那个位置产生数组的任何解决方案。
【问题讨论】: