Содержимое '\ / Date (' ') \ /' не начинается с '\ / Date (' и заканчивается ') \ /', как требуется для JSON

2

Я хочу отправить запрос на отправку в службу отдыха WCF, как вы можете видеть:

Guid id;
id = Guid.NewGuid();

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:47026/NewsRepository.svc/AddNews");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    string json = new JavaScriptSerializer().Serialize(new
    {       
        id = id,
        Subject="wfwf",
        ViewerCounter="1",
        Content="fsdsd",
        SubmitDatatime="2012/12/12",
        ModifiedDateTime="2012/12/12",
        PublisherName="sdaadasd",
        PictureAddress="adfafsd",
        TypeOfNews="adsadaad"                       
    });

    streamWriter.Write(json);
}
try 
{ 
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
    }
}
catch(Exception er)
{
    MessageBox.Show(er.ToString());
}

Но я получаю ошибку - 400 плохих запросов. Поэтому я проследил мой файл журнала WCF, и я нашел эту ошибку:

Ошибка десериализации объекта типа CMSManagement.Domain.Entity.News. Содержимое DateTime '2012/12/12' не начинается с '/Date (' и заканчивается на ')/', как требуется для JSON.

После моего дорогого знакомого кода @svek. Результат выглядит так:

Guid id;
id = Guid.NewGuid();

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:47026/NewsRepository.svc/AddNews");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "PUT";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
    {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
    };

    string json = JsonConvert.SerializeObject(new
    {
        id = id,
        Subject = "wfwf",
        ViewerCounter = "1",
        Content = "fsdsd",
        SubmitDatatime = "2012/12/12",
        ModifiedDateTime = "2012/12/12",
        PublisherName = "sdaadasd",
        PictureAddress = "adfafsd",
        TypeOfNews = "adsadaad"
    }, microsoftDateFormatSettings);
    streamWriter.Write(json);
}
try 
{ 
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
    }
}
catch(Exception er)
{
    MessageBox.Show(er.ToString());
}

Но я получаю ту же ошибку. Зачем?

Теги:
web-services
wcf

1 ответ

9
Лучший ответ

Использовать JsonConvert

Вместо использования

string json = new JavaScriptSerializer().Serialize( new {...} );

использование

//using Newtonsoft.Json;
string json = JsonConvert.SerializeObject(new {...} );

Настройка формата DateTime

До Json.NET 4.5 даты были написаны с использованием формата Microsoft: "/Date (1198908717056)/". Если вы хотите использовать этот формат или хотите поддерживать совместимость с сериализаторами Microsoft JSON или более ранними версиями Json.NET, измените параметр DateFormatHandling на MicrosoftDateFormat.

Источник: http://www.newtonsoft.com/json/help/html/DatesInJSON.htm

Формат по умолчанию Json.NET 4.5

// default as of Json.NET 4.5
string isoJson = JsonConvert.SerializeObject(data);
// { "MyDateProperty":"2009-02-15T00:00:00Z" }

Формат даты Microsoft

JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};

string microsoftJson = JsonConvert.SerializeObject(data, microsoftDateFormatSettings);
// { "MyDateProperty":"\/Date(1234656000000)\/" }

Формат JavaScript JSON

string javascriptJson = JsonConvert.SerializeObject(data, 
    new JavaScriptDateTimeConverter());
// { "MyDateProperty":new Date(1234656000000)}

Код решения

Вот полное рабочее решение для вашего вопроса:

JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};

string json = JsonConvert.SerializeObject(new
{
    id = id,
    Subject = "wfwf",
    ViewerCounter = "1",
    Content = "fsdsd",
    SubmitDatatime = "2012/12/12",
    ModifiedDateTime = "2012/12/12",
    PublisherName = "sdaadasd",
    PictureAddress = "adfafsd",
    TypeOfNews = "adsadaad"

}, microsoftDateFormatSettings); // ⇦ Added the format argument here

using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(streamWriter, json);
}
  • 0
    SerializeObject () в вашем коде не разрешен!
  • 0
    Код серьезности Описание Строка файла проекта Ошибка CS0426 Имя типа «SerializeObject» не существует в типе «JsonConvert» test_WCFService C: \ Users \ TFS-Symfa.UNION \ Desktop \ test_WCFService \ test_WCFService \ Form1.cs 49
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню