c# - 将 JSON 对象转换为 Data.Entities.Models.MyModel

标签 c# json entity-framework json.net

所以,

我在将 JSON 对象序列化为实体/模型对象时遇到问题。

我有以下代码片段:

var serializedValue = JsonConvert.SerializeObject(newRows, new MyModelConverter());

var csvToSave = JsonConvert.DeserializeObject<MyModel>(serializedValue);

其中 newRows 是 List<KeyValuePair<string,string>>

实体看起来像这样:

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; }

}

回顾旧的 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();
    }
}

但是当我运行我的程序时,我得到了这个错误:

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.

我的 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();
    }
}

但是我的 Json 对象现在看起来像这样:

[  
   {  
      "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
]

这很好,但仍然无法映射到我的实体

最佳答案

看起来您正在为每个 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"
   },
]

关于c# - 将 JSON 对象转换为 Data.Entities.Models.MyModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583463/

相关文章:

android - 如何使用 SharedPreferences 保存变量

c# - 如何在 WPF C# 应用程序中使用 SlimDX

c# - Binary(16) 字段正在截断 Guid 的尾随零

c# - AutoMapper 映射函数到成员的获取

json - Go 能够解码为 map[string][]interface{} 吗?

java - JSON解析器: Unexpected token COLON(:)

c# - 为什么从我的逐字字符串中删除换行符只返回最后一行?

c# - 如何使用 Linq 将列表集合获取到列表?

c# - 类库中的 SQLite。找不到数据库提供者

c# - 检查删除一行是否安全