使用JSON.Net

时间:2018-10-31 14:50:10

标签: c# arrays json serialization json.net

我正面临以下情况。我的一个项目正在引发一个包含以下对象的事件:

public class MyEvent : BaseEvent
{
   public long Id { get; set; }
   public Dictionary<string, long> Pairs { get; set; }
}

我收到了该事件,并在接收方读取了 byte [] 的数据。我必须读取任何通用事件的当前代码是:

public static T Decode(byte[] data)
{
    var serializer = JsonSerializer.Create(new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.Objects,
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    });

    using (var stream = new MemoryStream(data))
    {
        using (var sr = new StreamReader(stream, Encoding.UTF8))
        {
            var jr = new JsonTextReader(sr);
            var aux = Encoding.UTF8.GetString(data);
            return serializer.Deserialize(jr, typeof(T)) as T;
        }
    }
}

其中 T 是我的课程 MyEvent 。不幸的是,抛出的异常是:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型'System.Collections.Generic.Dictionary`2 [System.String,System.Int64]',因为该类型需要JSON对象(例如{“ name”:“ value”})正确反序列化。   要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。   路径“ OperationTimePairs”,第1行,位置61。

我读取它的方式是接收到的对象格式不正确。但是,如果我尝试通过 var aux = Encoding.UTF8.GetString(data); 读取它,可以看到结构是正确的。知道我该如何解决吗?谢谢!

编辑:

Json示例:

{  
   "Timestamp":"\/Date(1540996292134)\/",
   "Pairs":[  
      {  
         "Key":"first time",
         "Value":28
      },
      {  
         "Key":"second time",
         "Value":30
      },
      {  
         "Key":"third time",
         "Value":101
      },
      {  
         "Key":"operation time",
         "Value":231
      }
   ],
   "Id":123637
}

1 个答案:

答案 0 :(得分:1)

我认为您的课程与json字符串结构不匹配。

给出以下json字符串:

{  
   "Timestamp":"\/Date(1540996292134)\/",
   "Pairs":[  
      {  
         "Key":"first time",
         "Value":28
      },
      {  
         "Key":"second time",
         "Value":30
      },
      {  
         "Key":"third time",
         "Value":101
      },
      {  
         "Key":"operation time",
         "Value":231
      }
   ],
   "Id":123637
}

您可以更改模型以匹配json结构,如下所示:

public class MyEvent : BaseEvent
{
    public long Id { get; set; }
    public List<KeyValuePair<string, long>> Pairs { get; set; }

    [JsonIgnore]
    public Dictionary<string, long> PairsDictionary
    {
        get
        {
            if (Pairs == null)
            {
                return new Dictionary<string, long>();
            }

            return Pairs.ToDictionary(pair => pair.Key, pair => pair.Value);
        }
    }
}

public class BaseEvent
{
    public DateTime Timestamp { get; set; }
}

请注意:

  • PairsDictionary是基于对的不可序列化的属性
  • 鉴于您未提供BaseEvent的类定义,我将假定它仅具有1个属性

测试反序列化:

string json = @"{  
""Timestamp"":""\/Date(1540996292134)\/"",
""Pairs"":[  
    {  
     ""Key"":""first time"",
     ""Value"":28
    },
    {  
     ""Key"":""second time"",
     ""Value"":30
    },
    {  
     ""Key"":""third time"",
     ""Value"":101
    },
    {  
     ""Key"":""operation time"",
     ""Value"":231
    }
],
""Id"":123637
}";

MyEvent eventData = JsonConvert.DeserializeObject<MyEvent>(json);

或作为替代方法(使用泛型):

T data = JsonConvert.DeserializeObject(json, typeof(T)) as T;