RestSharp: 反序列化 JSON 字符串

3

我一直在尝试反序列化response.Content字符串,但一直失败。WebApi操作返回带有额外自定义错误的修改过的modelState

在MVC方面,我尝试了以下方法,但都没有成功:

JsonDeserializer deserial = new JsonDeserializer();
  var json = deserial.Deserialize<dynamic>(response);

而且
    var json = JsonConvert.DeserializeObject<WebApiReturnModel>(response.Content);

    public class WebApiReturnModel
    {
        public string Message { get; set; }

        public ModelStateDictionary ModelState { get; set; }
    }

response.Content返回示例:

{
    "Message":"The request is invalid.",
    "ModelState":{
        "": ["Name Something is already taken.","Email 'ab@something.com' is already taken."]
            }
}

如何使此功能正常工作?


ModelStateDictionary 是如何设计的? - Amit Kumar Ghosh
@Amit 这是默认的 .Net 实现。 - Shyamal Parikh
1个回答

1
我尝试使用动态方法,对我来说这个方法可行:
var input = @"{
                ""Message"":""The request is invalid."",
                ""ModelState"":{
                            """": [""Name Something is already taken."",""Email 'ab@something.com' is already taken.""]
                }
            }";

// This uses JSON.Net, as your second snippet of code.
var json = JsonConvert.DeserializeObject<dynamic>(input);

// This will get: The request is invalid.
var message = json["Message"].Value;

foreach (var m in json["ModelState"][""])
{
    // This will get the messages in the ModelState.
    var errorMessage = m.Value;
}

如果您不知道ModelState中键的名称,可以使用嵌套循环:

foreach (var m in json["ModelState"])
{
    foreach (var detail in m.Value)
    {
        // This will get the messages in the ModelState.
        var errorMessage = detail.Value;
    }
}

json["ModelState"][""] 的唯一问题是在使用之前必须知道键。必须有更好的方法。 - Shyamal Parikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接