C# 将JSON对象转换为Data.Entities.Models.MyModel
所以 我在将JSON对象序列化为实体/模型对象时遇到问题 我有以下代码片段:C# 将JSON对象转换为Data.Entities.Models.MyModel,c#,json,entity-framework,json.net,C#,Json,Entity Framework,Json.net,所以 我在将JSON对象序列化为实体/模型对象时遇到问题 我有以下代码片段: var serializedValue = JsonConvert.SerializeObject(newRows, new MyModelConverter()); var csvToSave = JsonConvert.DeserializeObject<MyModel>(serializedValue); 回顾以前的StackOverflow文章,我发现我需要使用一个定制的JsonConverte
var serializedValue = JsonConvert.SerializeObject(newRows, new MyModelConverter());
var csvToSave = JsonConvert.DeserializeObject<MyModel>(serializedValue);
回顾以前的StackOverflow文章,我发现我需要使用一个定制的JsonConverter,以便将数据转换为json对象
下面是我的转换器类:
public class MyModelConverter : JsonCreationConverter<MyModel>
{
protected override MyModel Create(Type objectType, JObject jObject)
{
return new MyModel();
}
}
public abstract class JsonCreationConverter<T> : JsonConverter
{
/// <summary>
/// Create an instance of objectType, based properties in the JSON object
/// </summary>
/// <param name="objectType">type of object expected</param>
/// <param name="jObject">
/// contents of JSON object that will be deserialized
/// </param>
/// <returns></returns>
protected abstract T Create(Type objectType, JObject jObject);
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
}
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
T target = Create(objectType, jObject);
// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);
return target;
}
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
List<KeyValuePair<string, object>> list = value as List<KeyValuePair<string, object>>;
writer.WriteStartArray();
foreach (var item in list)
{
writer.WriteStartObject();
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
我的Json对象现在看起来像这样:
[
{
"Key":"Attributed Touch Time",
"Value":"2016-09-06 20:11:50"
},
{
"Key":"Install Time",
"Value":"2016-09-06 20:14:12"
},
{
"Key":"Event Name",
"Value":"install"
}
]
然后我像这样修复了我的转换器:
public abstract class JsonCreationConverter<T> : JsonConverter
{
/// <summary>
/// Create an instance of objectType, based properties in the JSON object
/// </summary>
/// <param name="objectType">type of object expected</param>
/// <param name="jObject">
/// contents of JSON object that will be deserialized
/// </param>
/// <returns></returns>
protected abstract T Create(Type objectType, JObject jObject);
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<KeyValuePair<string, string>>);
}
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
T target = Create(objectType, jObject);
// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);
return target;
}
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
List<KeyValuePair<string, string>> list = value as List<KeyValuePair<string, string>>;
writer.WriteStartArray();
foreach (var item in list)
{
writer.WriteStartObject();
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
这很好,但仍然不会映射到我的实体看起来您正在为每个KVP创建一个新的JSON对象,而不是将KVP分组到单个对象中。移动
writer.WriteStartObject()
和writer.EndObject()代码>到循环之外,您应该得到一个格式良好的JSON对象
writer.WriteStartObject();
foreach (var item in list)
{
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
}
writer.WriteEndObject();
writer.WriteEndArray();
您需要将这些开始/结束对象置于For循环之外
所以你应该换成这个
[
{
"Attributed Touch Time":"2016-09-06 20:11:50"
"Install Time":"2016-09-06 20:14:12"
"Event Name":"install"
},
]
值是从哪里来的?值是新行,上面是我从csv文件中读取的数据,解析并最终添加到List@Sampath请参见编辑。谢谢
[
{
"Attributed Touch Time":"2016-09-06 20:11:50"
},
{
"Install Time":"2016-09-06 20:14:12"
},
{
"Event Name":"install"
},
(etc...) //Not part of JSON, just cutting it short
]
writer.WriteStartObject();
foreach (var item in list)
{
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
}
writer.WriteEndObject();
writer.WriteEndArray();
[
{
"Attributed Touch Time":"2016-09-06 20:11:50"
"Install Time":"2016-09-06 20:14:12"
"Event Name":"install"
},
]