Подтвердить что ты не робот

Верните 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);
4b9b3361

Ответ 1

я нашел решение здесь

return new HttpResponseMessage() 
{
    Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};

Ответ 2

У меня была такая же проблема, пока еще несколько минут назад. Оказывается, я был "двойной сериализацией" строки JSON. Я использую вызов jQuery $.getJson( AJAX для действия контроллера JsonResult. И поскольку действие создает С# Generic List<t>, я думал, что мне пришлось использовать JSON.net/NewtonSoft для преобразования С# Generic List<t> в объект JSON, прежде чем возвращать JSON, используя следующее:

return Json(fake, JsonRequestBehavior.AllowGet);

В конце концов, мне не пришлось использовать метод JsonConvert.SerializeObject(, очевидно, что это return преобразует сериализацию для нас.

Надеюсь, это поможет вам или кому-то еще.

Ответ 3

Скорее всего, косая черта - это артефакт, потому что вы скопировали их из отладчика VisualStudio. Отладчик отображает все строки таким образом, чтобы их можно было вставить в код C/С#. Они не находятся в передаваемых данных.

Кстати: эти косые черты - обратные косые черты. Косая черта будет выглядеть так:/.

Ответ 4

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"`

Ответ 5

Для того, чтобы увидеть "полный" фрагмент кода, это то, что я использовал для решения:

    [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);
        }
    }

Ответ 6

Спустя несколько часов, пытаясь понять это, один популярный ответ на этот вопрос, казалось, был точным для меня. Но не так, как я себе представлял.

Мой код был очень прост:

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);

Ответ 7

В основном это происходит из-за двойной сериализации. У меня была одна и та же проблема, когда мне пришлось сериализовать коллекцию в строку Json и даже после использования различных обходных решений, которые я не смог решить. Итак, наконец, удалили весь код сериализации и просто вернули объект коллекции, и по умолчанию сериализация позаботилась. Поэтому попробуйте удалить код сериализации и просто вернуть возвращаемый тип. Надеюсь, что это поможет кому-то с подобными проблемами.

Ответ 8

У меня такая же проблема, ответ содержит "когда я использую

        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);

Ответ 9

Я обнаружил, что для меня работает комбинация ответов. Я был дважды сериализован как кто-то, упомянутый выше. Для того чтобы сериализация распознала ваш атрибут JsonProperty, вы должны использовать сериализатор JsonConvert. Например, у меня есть свойство ActualtTarget, но оно нужно для сериализации как Actual-Target. Результат Json не будет распознавать JsonProperty при сериализации, поэтому я сериализовался с помощью JsonConvert и просто вернул строку, как показано ниже:

return Content(JsonConvert.SerializeObject(myData));

Ответ 10

Я нашел решение и работал у меня (Y)

var yourString = yourString.Replace("\\","");

Я получил его из здесь

Ответ 11

Здесь я нашел решение:

                    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
                }

Ответ 12

Я нашел решение, и это сработало для меня:

var json = JsonConvert.SerializeObject(sb.ToString(), Formatting.Indented);
response.Content = new StringContent(json, Encoding.UTF8 , "application/json");

Ответ 13

Это только для 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 как обычно.