Ответ 1
я нашел решение здесь
return new HttpResponseMessage()
{
Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};
Я использую MVC4 web-api, С# и хочу вернуть Json, используя Json.net.
проблема в том, что он идет с "обратными слешами".
Я также добавил этот код в Global.asax.
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
вот что он возвращает.
"{\"cid\":1,\"model\":\"WT50JB\",\"detail\":\"sdf??\",\"unit\":2,\"time_in\":\"2012-12-11T19:00:00\",\"time_out\":\"2012-12-12T13:00:06.2774691+07:00\",\"time_used_dd\":0.0,\"time_used_hh\":0.0}"
так что я хочу увидеть это
{"cid":1,"model":"WT50JB","detail":"sdf??","unit":2,"time_in":"2012-12-11T19:00:00","time_out":"2012-12-12T13:08:50.5444555+07:00","time_used_dd":0.0,"time_used_hh":0.0}
вот JsonConvertor
string json = JsonConvert.SerializeObject(myObj);
я нашел решение здесь
return new HttpResponseMessage()
{
Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};
У меня была такая же проблема, пока еще несколько минут назад. Оказывается, я был "двойной сериализацией" строки JSON. Я использую вызов jQuery $.getJson(
AJAX для действия контроллера JsonResult
. И поскольку действие создает С# Generic List<t>
, я думал, что мне пришлось использовать JSON.net/NewtonSoft для преобразования С# Generic List<t>
в объект JSON, прежде чем возвращать JSON, используя следующее:
return Json(fake, JsonRequestBehavior.AllowGet);
В конце концов, мне не пришлось использовать метод JsonConvert.SerializeObject(
, очевидно, что это return
преобразует сериализацию для нас.
Надеюсь, это поможет вам или кому-то еще.
Скорее всего, косая черта - это артефакт, потому что вы скопировали их из отладчика VisualStudio. Отладчик отображает все строки таким образом, чтобы их можно было вставить в код C/С#. Они не находятся в передаваемых данных.
Кстати: эти косые черты - обратные косые черты. Косая черта будет выглядеть так:/.
using Newtonsoft.Json.Linq;
string str = "Your String with Back Slashes";
str = JToken.Parse(str).ToString(); `// Now You will get the Normal String with "NO SLASHES"`
Для того, чтобы увидеть "полный" фрагмент кода, это то, что я использовал для решения:
[AllowAnonymous]
[HttpGet]
public HttpResponseMessage GetAllMessages()
{
try
{
//Load Data Into List
var mm = new MessageManager();
List<Message> msgs = mm.GetAllMessages();
//Convert List Into JSON
var jsonmsgs = JsonConvert.SerializeObject(msgs);
//Create a HTTP response - Set to OK
var res = Request.CreateResponse(HttpStatusCode.OK);
//Set the content of the response to be JSON Format
res.Content = new StringContent(jsonmsgs, System.Text.Encoding.UTF8, "application/json");
//Return the Response
return res;
}
catch (Exception exc)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc);
}
}
Спустя несколько часов, пытаясь понять это, один популярный ответ на этот вопрос, казалось, был точным для меня. Но не так, как я себе представлял.
Мой код был очень прост:
this.Request.CreateResponse(HttpStatusCode.Accepted, new JavaScriptSerializer().Serialize(obj));
Я был уверен, что популярный ответ "двойной сериализации" не применим ко мне. В конце концов, я явно сериализую свой объект на JSON только один раз.
Я пробовал этот фрагмент:
new StringContent(json, System.Text.Encoding.UTF8, "application/json")
Который даже не содержал моих данных! Вместо этого это то, что я получил:
{
"Headers": [
{
"Key": "Content-Type",
"Value": [
"application/json; charset=utf-8"
]
}
]
}
Хммм... Но вот и вот! Внимательно изучая мой первоначальный ответ в пользовательском интерфейсе Swagger, а после копирования и вставки его в конструктор JSON - я был как-то "двойной сериализацией". Используя следующий код, вы получите правильный ответ JSON:
this.Request.CreateResponse(HttpStatusCode.Accepted, obj);
Это правильно! просто отправьте сериализуемый объект напрямую, не нужно сериализовать JSON! Кажется, ответ автоматически преобразует объекты в JSON. Надеюсь, это поможет!
ИЗМЕНИТЬ: Если вы начинаете с строки JSON, например, скажем, из базы данных, вы можете десериализовать строку в объект и вернуть этот объект - например:
object obj = new JavaScriptSerializer().DeserializeObject(json);
this.Request.CreateResponse(HttpStatusCode.Accepted, obj);
В основном это происходит из-за двойной сериализации. У меня была одна и та же проблема, когда мне пришлось сериализовать коллекцию в строку Json и даже после использования различных обходных решений, которые я не смог решить. Итак, наконец, удалили весь код сериализации и просто вернули объект коллекции, и по умолчанию сериализация позаботилась. Поэтому попробуйте удалить код сериализации и просто вернуть возвращаемый тип. Надеюсь, что это поможет кому-то с подобными проблемами.
У меня такая же проблема, ответ содержит "когда я использую
JObject res = processRequst(req);
String szResponse = res.ToString(Formatting.None);
return Request.CreateResponse<string>(HttpStatusCode.OK, szResponse);
И эти обратные слэши удаляются, если я заменил приведенный выше код на
JObject res = processRequst(req);
return Request.CreateResponse<JObject>(HttpStatusCode.OK, res);
Я обнаружил, что для меня работает комбинация ответов. Я был дважды сериализован как кто-то, упомянутый выше. Для того чтобы сериализация распознала ваш атрибут JsonProperty, вы должны использовать сериализатор JsonConvert. Например, у меня есть свойство ActualtTarget, но оно нужно для сериализации как Actual-Target. Результат Json не будет распознавать JsonProperty при сериализации, поэтому я сериализовался с помощью JsonConvert и просто вернул строку, как показано ниже:
return Content(JsonConvert.SerializeObject(myData));
Я нашел решение и работал у меня (Y)
var yourString = yourString.Replace("\\","");
Я получил его из здесь
Здесь я нашел решение:
response = response.replace("\"", "\\").replace("\\\\", "\"").replace("\\", "");
JSONArray PackageData = new JSONArray(response);
SelectSymbolList.clear();
for (int i = 0; i < PackageData.length(); i++) {
JSONObject jsonData = PackageData.getJSONObject(i);
// get your array here
}
Я нашел решение, и это сработало для меня:
var json = JsonConvert.SerializeObject(sb.ToString(), Formatting.Indented);
response.Content = new StringContent(json, Encoding.UTF8 , "application/json");
Это только для JsonSerializerSettings
когда вам нужно сериализовать объект, используя JsonSerializerSettings
и ContractResolver
. Это позволит вам избежать циклических ссылок.
var serializerSettings = new JsonSerializerSettings
{
ContractResolver = .... your contract resolver ....,
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
DefaultValueHandling = DefaultValueHandling.Ignore,
};
// convert it to JSON with all the ugly slashes
var json = JsonConvert.SerializeObject(existingContact, serializerSettings);
// now deserialize it into an object
var obj = JsonConvert.DeserializeObject(json);
Затем отправьте obj
обратно на ваш контроллер и используйте JsonResult как обычно.