我想序列化和反序列化一个
c#
使用Newtonsoft的模型。序列化工作良好,但反序列化会抛出一个错误:
Error converting value "1" to type ProjectNamespace.CapturedObject'. Path '', line 14, position 19.'
Visual Studio还表示:
Inner Exception: ArgumentException: Could not cast or convert from System.String to ProjectNamespace.CapturedObject.
我需要帮助来解释这个错误消息。以下是相关课程。。。
错误被抛出
Json Extension Converter
在线上
return new Collection<T> { token.ToObject<T>() };
我从那里得到的
here
序列化/反序列化
public class JsonSession
{
private readonly JsonSerializer serializer = new JsonSerializer();
private static JsonSerializerSettings GetJsonSerializerSettings()
{
JsonSerializerSettings settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Objects,
Converters = new List<JsonConverter>
{
new StringEnumConverter()
}
};
return settings;
}
JsonSerializerSettings writerSettings = GetJsonSerializerSettings();
/// <summary>
/// Constructor
/// </summary>
public JsonSession() { }
/// <summary>
/// Deserialization
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public JsonModel OpenModel(string filePath)
{
using (StreamReader file = File.OpenText(filePath))
return (JsonModel)serializer.Deserialize(file, typeof(JsonModel));
}
/// <summary>
/// Serialization
/// </summary>
/// <param name="model"></param>
/// <param name="filePath"></param>
public void SaveModel(JsonModel model, string filePath)
{
using (StreamWriter file = File.CreateText(filePath))
using (var writer = new JsonTextWriter(file))
{
writer.Formatting = Formatting.Indented;
serializer.Serialize(writer, model);
}
}
}
JsonModel
公共类JsonModel
{
[JsonProperty("head")]
public JsonHeader Header { get; set; } = new JsonHeader();
[JsonProperty("application")]
public JsonApplication Application { get; set; } = new JsonApplication();
[JsonProperty("knowledgebase")]
public JsonBase JsonBase { get; set; } = new JsonBase();
#endregion
#region Constructors
public JsonModel() { }
public JsonModel(JsonHeader header, JsonBase jsonBase)
{
this.Header = header;
this.JsonBase = jsonBase;
}
}
知识库
#region Public Members
[JsonProperty("features")]
[JsonConverter(typeof(JsonConverterExtension<CapturedObject>))]
public Collection<CapturedObject> Features { get; set; } = new Collection<CapturedObject>();
[JsonProperty("faces")]
[JsonConverter(typeof(JsonConverterExtension<CapturedObject>))]
public Collection<CapturedObject> Faces { get; set; } = new Collection<CapturedObject>();
[JsonProperty("edges")]
[JsonConverter(typeof(JsonConverterExtension<CapturedObject>))]
public Collection<CapturedObject> Edges { get; set; } = new Collection<CapturedObject>();
[JsonProperty("vertices")]
[JsonConverter(typeof(JsonConverterExtension<CapturedObject>))]
public Collection<CapturedObject> Vertices { get; set; } = new Collection<CapturedObject>();
[JsonProperty("dimensions")]
[JsonConverter(typeof(JsonConverterExtension<CapturedObject>))]
public Collection<CapturedObject> Dimensions { get; set; } = new Collection<CapturedObject>();
#endregion
#region Constructors
public JsonBase() { }
#endregion
}
捕获对象类
public class CapturedObject
{
[JsonProperty("pseudonym")]
public string Pseudonym { get; set; }
[JsonProperty("name")]
public string ObjectName { get; set; }
[JsonProperty("type")]
public ModelObjectType ObjectType { get; set; }
#endregion
#region Constructor
public CapturedObject() { }
}
#Json-转换器扩展
class JsonConverterExtension<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<T>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<Collection<T>>();
}
return new Collection<T> { token.ToObject<T>() };
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
List<object> list = new List<object>();
if (value is IEnumerable)
{
var enumerator = ((IEnumerable)value).GetEnumerator();
while (enumerator.MoveNext())
{
list.Add(enumerator.Current);
}
}
// List<T> list = (List<T>)value;
if (list.Count == 1)
{
value = list[0];
}
serializer.Serialize(writer, value);
}
}
#编辑:示例Json
{
"head": {
"author": "User",
"date": "8-20-2020",
"application": "App",
"cad": "swx",
"name": "C:\\Users\\User\\Desktop\\so.json",
"location": "C:\\Users\\User\\Desktop\\so.json"
},
"application": {
"name": "App",
"language": "English",
"versions": "1",
"extensions": ".json"
},
"knowledgebase": {
"features": [
{
"pseudonym": "Caster Casing",
"name": "BoddExtrude1",
"type": 22
},
{
"pseudonym": "Wheel",
"name": "Revolve2",
"type": 22
},
{
"pseudonym": "Corner Vertex",
"name": "Fillet1",
"type": 22
}
],
"vertices": {
"pseudonym": "Corner Vertex",
"name": "SpecialVertex",
"type": 3
},
"dimensions": {
"pseudonym": "Cool Dimension",
"name": "D1@Sketch2",
"type": 14
}
}
}