如何在Advanced Rest Client中的POST请求中将字典作为有效负载的一部分传递

时间:2015-08-07 18:31:02

标签: c# json rest dictionary rest-client

我正在尝试使用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);
            }
}

2 个答案:

答案 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