- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 JSON 数组,其中包含具有不同属性的不同类型的对象。其中一个属性称为“类型”,并确定数组项的类型。这是我的数据示例:
[{
type : "comment",
text : "xxxx"
}, {
type : "code",
tokens : [{
type : "ref",
data : "m"
}, {
type : "operator",
data : "e"
}
]
}, {
type : "for",
boundLocal : {
type : "local",
name : "i",
kind : "Number"
},
upperBound : {
type : "ref",
tokens : [{
type : "operator",
data : "3"
}, {
type : "operator",
data : "0"
}
]
},
body : [{
type : "code",
tokens : [{
type : "ref",
data : "x"
}
]
}, {
type : "code",
tokens : [{
type : "ref",
data : "y"
}
}
]
]
]
为了将这些对象映射到我的 .Net 实现,我定义了一组类:一个基类和几个子类(具有复杂的层次结构,具有 4 个“代”)。这里只是这些类的一个小例子:
public abstract class TExpression
{
[JsonProperty("type")]
public string Type { get; set; }
}
public class TComment : TExpression
{
[JsonProperty("text")]
public string Text { get; set; }
}
public class TTokenSequence : TExpression
{
[JsonProperty("tokens")]
public List<TToken> Tokens { get; set; }
}
我想要达到的是能够将这个数组反序列化为一个协变的泛型列表,声明为:
List<TExpression> myexpressions = JsonConvert.DeserializeObject<List<TExpression>>(aststring);
此列表应包含从 TExpression 继承的适当子类的实例,因此我可以稍后在我的代码中使用以下代码:
foreach(TExpression t in myexpressions)
{
if (t is TComment) dosomething;
if (t is TTokenSequence) dosomethingelse;
}
如何使用 JSON.NET 访问它?
最佳答案
这是一个使用 CustomCreationConverter 的示例。
public class JsonItemConverter : Newtonsoft.Json.Converters.CustomCreationConverter<Item>
{
public override Item Create(Type objectType)
{
throw new NotImplementedException();
}
public Item Create(Type objectType, JObject jObject)
{
var type = (string)jObject.Property("valueType");
switch (type)
{
case "int":
return new IntItem();
case "string":
return new StringItem();
}
throw new ApplicationException(String.Format("The given vehicle type {0} is not supported!", type));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Load JObject from stream
JObject jObject = JObject.Load(reader);
// Create target object based on JObject
var target = Create(objectType, jObject);
// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);
return target;
}
}
public abstract class Item
{
public string ValueType { get; set; }
[JsonProperty("valueTypeId")]
public int ValueTypeId { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
public new virtual string ToString() { return "Base object, we dont' want base created ValueType=" + this.ValueType + "; " + "name: " + Name; }
}
public class StringItem : Item
{
[JsonProperty("value")]
public string Value { get; set; }
[JsonProperty("numberChars")]
public int NumberCharacters { get; set; }
public override string ToString() { return "StringItem object ValueType=" + this.ValueType + ", Value=" + this.Value + "; " + "Num Chars= " + NumberCharacters; }
}
public class IntItem : Item
{
[JsonProperty("value")]
public int Value { get; set; }
public override string ToString() { return "IntItem object ValueType=" + this.ValueType + ", Value=" + this.Value; }
}
class Program
{
static void Main(string[] args)
{
// json string
var json = "[{\"value\":5,\"valueType\":\"int\",\"valueTypeId\":1,\"name\":\"numberOfDups\"},{\"value\":\"some thing\",\"valueType\":\"string\",\"valueTypeId\":1,\"name\":\"a\",\"numberChars\":11},{\"value\":2,\"valueType\":\"int\",\"valueTypeId\":2,\"name\":\"b\"}]";
// The above is deserialized into a list of Items, instead of a hetrogenous list of
// IntItem and StringItem
var result = JsonConvert.DeserializeObject<List<Item>>(json, new JsonItemConverter());
foreach (var r in result)
{
// r is an instance of Item not StringItem or IntItem
Console.WriteLine("got " + r.ToString());
}
}
}
关于c# - 使用 Json.NET 将异构 JSON 数组反序列化为协变 List<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8241392/
我有一个 NSTreeController (向 NSOutlineView 提供内容)。我希望顶级对象属于一个类,而所有其他对象(因此,任何级别的子对象)属于另一个类。解决这个问题的最佳方法是什么?
我有一个如下所示的 GADT data MyTypes = MyInt | MyDouble data Test (t :: MyTypes) where A :: Int -
我需要一个高效的异构数组,其中第一个元素是 int,其余是 float。然而,创建它之后,基本的数组操作就会呈爆炸式增长。 A = np.zeros(1, dtype='i4, f4, f4') B
我有一个 pandas DataFrame,其中包含需要拆分成平衡切片的字符串和浮点列,以便训练 sklearn 管道。 理想情况下,我会使用 StratifiedKFold在 DataFrame 上
是否有一种异构容器的形式,能够存储例如不同的基本类型(例如int、float、double)? 最终我希望能够在计算中使用元素而无需显式引用类型,例如 auto res = a + b,其中操作数 a
假设我有一个结构(或类),如下所示: struct _particle { std::vector vx , vy; std::vector id; std::vector rx, ry; }; ty
我在将具有 > 22 列的表专门映射到 case class 时遇到问题,假设您有以下代码 import slick.driver.PostgresDriver import scala.slick.
我是一名优秀的程序员,十分优秀!