Ошибка JavaScriptSerializer: «ResponseBody» не поддерживается для десериализации массива

Я отправляю строку json в качестве http-запроса и получаю строку json в ответ. Я создал свои собственные классы для сериализации и десериализации. Они выглядят следующим образом:

На стороне запроса -

public class RequestHead
{        
    public string source {get; set;}        
    public string dest {get; set;}        
}

public class RequestBody
{
    private List<string> id {get; set;}        
    public bool direction {get; set;}

    public RequestBody()
    {
        this.id = new List<string>();
    }
}

public class RequestObj
{        
    public RequestHead head {get; set;}
    public RequestBody body {get; set;}
}

На стороне ответа -

public class ResponseHead
{        
    public bool result {get; set;}        
    public float time {get; set;}        
}

public class ResponseBody
{        
    public List<string> body{get; set;}
}

public class ResponseObj
{        
    public ResponseBody body {get; set;}        
    public ResponseHead head {get; set;}        
}

В файле .asmx

            RequestObj request_obj = new RequestObj();
            request_obj.head = head;
            request_obj.body = body;

            var httpWebRequest = (HttpWebRequest)WebRequest.Create("the url");
            httpWebRequest.ContentType = "text/json";
            httpWebRequest.Method = "POST";
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                string json = serializer.Serialize(request_obj);
                streamWriter.Write(json);
            }
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
                ResponseObj response_obj = new ResponseObj();
                response_obj = serializer.Deserialize<ResponseObj>(responseText);
                ResponseBody response_body = new ResponseBody();
                response_body = response_obj.body;
                ResponseHead response_head = new ResponseHead();
                response_head = response_obj.head;                    
            }

Я сослался на этот пост, который является именно тем сценарием, который у меня есть: .MissingMethodException: Ошибка при десериализации массива json Но упомянутое здесь решение для создания списка не работает для меня, или я делаю что-то еще неправильно.

Все работает хорошо на конце запроса. На стороне ответа тело может содержать 1 строку или массив строк. Независимо от того, есть ли у меня один или массив, я все равно получаю ту же ошибку.

Я не хочу использовать JSON.NET


person neuDev33    schedule 20.04.2012    source источник
comment
Похоже на XY-проблема   -  person L.B    schedule 21.04.2012


Ответы (2)


Я думаю, что проблема в том, что вы не установили флаг [Serializable] как:

[Serializable]
public class ResponseHead
{        
    public bool result {get; set;}        
    public float time {get; set;}        
}

[Serializable]
public class ResponseBody
{        
    public List<string> body{get; set;}
}

[Serializable]
public class ResponseObj
{        
    public ResponseBody body {get; set;}        
    public ResponseHead head {get; set;}        
}
person Aristos    schedule 21.04.2012

Это то, что сработало для меня -

Измените тип тела на строку [] вместо списка

И измените код на -

            var rbody = serializer.Deserialize<ResponseBody>(responseText);                              
            response_obj.body = new ResponseBody();
            response_obj.body.body = rbody.body.ToArray(); 
person neuDev33    schedule 23.04.2012