将JSON对象转换为Data.Entities.Models.MyModel [英] Converting JSON object to Data.Entities.Models.MyModel

查看:89
本文介绍了将JSON对象转换为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>

  [
{
归属触摸时间:2016-09-06 20:11:50
},
{
安装时间:2016-09-06 20:14:12
},
{
事件名称:安装
},
(etc ...)//不是JSON的一部分,只需切割它
]
pre>

哪个是伟大的,但仍然不会映射到我的实体

解决方案

您似乎正在为每个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(); and writer.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆