我正在尝试使用Advanced Rest Client Chrome Extension在本地测试我的WebApi 我想将字典作为有效负载的一部分传递给我想要的POST请求。虽然调试我发现字典即使我以json格式传递它也没有正确地反序列化并且字典的计数仍为零。
有效负载示例:
{
"DictionaryForEvaluationTelemetries" :{ "B":"{\"Counter\":\"500\"}"}
}
这是对象的简单代码,它是字典的一部分
[DataContract]
class Class1
{
private int counter;
[DataMember]
public int Counter
{
get { return counter; }
}
public void Increment()
{
Interlocked.Increment(ref counter);
}
}
[DataContract]
public class TelemetryPayload
{
[DataMember]
public ConcurrentDictionary<string, Class1> DictionaryForEvaluationTelemetries { get; set; }
}
[HttpPost]
public void LogEvaluationTelemetry()
{
// Internally the below method does : JsonSerializer<T>.Deserialize(request.Content.ReadAsStringAsync().Result);
var telemetryPayload = Request.GetObjectFromBody<TelemetryPayload>();
}
JSON反序列化由System.Runtime.Serialization.Json
完成using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
public static class JsonSerializer<T> where T : class
{
public static T Deserialize(string jsonObject)
{
byte[] array = Encoding.UTF8.GetBytes(jsonObject);
using (MemoryStream ms = new MemoryStream(array))
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T));
return (T)jsonSerializer.ReadObject(ms);
}
}
答案 0 :(得分:1)
据我所知,你传递的json没有一个会映射到Class1的对象。你的json应该是这样的:
{
"DictionaryForEvaluationTelemetries" : {"B": {"Counter": 500}}
}
其中DictionaryForEvaluationTelemetries.B将映射到Class1。
或者,取决于Request.GetObjectFromBody&lt;&gt;方法确实如此:
{"Counter" : 500}
答案 1 :(得分:1)
上述问题存在两个问题: 1)有效载荷格式不正确:
private
2)对于反序列化,我使用的是System.Runtime.Serialization.Json。我改为使用NewtonSoft.Json JsonConvert.DeserializeObject