将JSON对象转换为Data.Entities.Models.MyModel [英] Converting JSON object to Data.Entities.Models.MyModel
问题描述
所以,
我将JSON对象序列化到我的Entity / Model对象有问题。
我有以下代码片段:
var serializedValue = JsonConvert .SerializeObject(newRows,new MyModelConverter());
var csvToSave = JsonConvert.DeserializeObject&MyModel>(serializedValue);
其中newRows是一个列表< KeyValuePair< string,string>> / code>
实体看起来像这样:
public class MyModel:Entity
{
public int Id {get;组; } //主键
public DateTime TouchTime {get;组; }
public DateTime InstallTime {get;组; }
public string EventName {get;组; }
}
回顾旧的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>
///在JSON对象中创建一个基于objectType的属性的实例
///< / summary>
///< param name =objectType>对象类型的预期< / param>
///< param name =jObject>
///将反序列化的JSON对象的内容
///< / 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)
{
//从流
加载JObject JObject jObject = JObject.Load(reader);
//基于JObject
创建目标对象T target = Create(objectType,jObject);
//填充对象属性
serializer.Populate(jObject.CreateReader(),target);
返回目标;
}
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
列表< KeyValuePair< string,对象>> list = value作为List< KeyValuePair< string,object>> ;;
writer.WriteStartArray();
foreach(列表中的var项)
{
writer.WriteStartObject();
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
但是当我运行我的程序,我得到这个错误而不是
不能将当前JSON数组(例如[1,2,3])反序列化为Data.Entities.Models因为该类型需要一个JSON对象(例如{name:value})才能正确反序列化。
现在我的Json对象看起来像这样:
[
{
键:归属触摸时间,
值:2016-09-06 20:11: 50
},
{
密钥:安装时间,
值:2016-09-06 20:14:12
{
Key:事件名称,
值:安装
}
]
然后我修改了我的转换器:
public abstract class JsonCreationConverter< T> :JsonConverter
{
///< summary>
///在JSON对象中创建一个基于objectType的属性的实例
///< / summary>
///< param name =objectType>对象类型的预期< / param>
///< param name =jObject>
///将反序列化的JSON对象的内容
///< / 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)
{
//从流
加载JObject JObject jObject = JObject.Load(reader);
//基于JObject
创建目标对象T target = Create(objectType,jObject);
//填充对象属性
serializer.Populate(jObject.CreateReader(),target);
返回目标;
}
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
列表< KeyValuePair< string,串GT;> list = value作为List< KeyValuePair< string,string>> ;;
writer.WriteStartArray();
foreach(列表中的var项)
{
writer.WriteStartObject();
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
但是我的Json对象现在看起来像这样: p>
[
pre>
{
归属触摸时间:2016-09-06 20:11:50
},
{
安装时间:2016-09-06 20:14:12
},
{
事件名称:安装
},
(etc ...)//不是JSON的一部分,只需切割它
]
哪个是伟大的,但仍然不会映射到我的实体
解决方案您似乎正在为每个KVP创建一个新的JSON对象,而不是将KVP分组到单个对象中。将
writer.WriteStartObject();
和writer.EndObject();
移动到循环外部,然后结束一个很好的JSON对象。writer.WriteStartObject();
foreach(列表中的var项)
{
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
}
writer.WriteEndObject();
writer.WriteEndArray();
您需要将这些开始/结束对象带到For循环之外。
所以你应该得到这个...
[
{
归属触摸时间:2016-09-06 20:11:50
安装时间:2016-09-06 20:14:12
事件名称: 安装
},
]
So,
I'm having an issue with serializing my JSON object to my Entity/Model object.
I have the following code snippet:
var serializedValue = JsonConvert.SerializeObject(newRows, new MyModelConverter()); var csvToSave = JsonConvert.DeserializeObject<MyModel>(serializedValue);
Where newRows is a
List<KeyValuePair<string,string>>
Where Entity looks something like this:
public class MyModel: Entity { public int Id { get; set; } //primary key public DateTime TouchTime { get; set; } public DateTime InstallTime { get; set; } public string EventName { get; set; } }
Looking back at old StackOverflow posts, I see I need to use a custom JsonConverter so that I can get my data to be converted to a json object.
Here's my converter class:
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(); } }
But when I run my program, I get this error instead:
Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Data.Entities.Models.MyModel' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
Where my Json object looks like this now:
[ { "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" } ]
Then I fixed my converter like so:
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(); } }
But my Json object now looks like this:
[ { "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 ]
Which is great but still won't map to my entities
解决方案It looks like you're creating a new JSON object for each KVP rather than grouping the KVP's into a single object. Move the
writer.WriteStartObject();
andwriter.EndObject();
to outside of the loop and you should end up with a nicely formed JSON Object.writer.WriteStartObject(); foreach (var item in list) { writer.WritePropertyName(item.Key); writer.WriteValue(item.Value); } writer.WriteEndObject(); writer.WriteEndArray();
You need to take those Start/End Objects to outside the For loop.
So you should get this instead...
[ { "Attributed Touch Time":"2016-09-06 20:11:50" "Install Time":"2016-09-06 20:14:12" "Event Name":"install" }, ]
这篇关于将JSON对象转换为Data.Entities.Models.MyModel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!