2016-01-25 7 views
2

Я пытаюсь создать объект JSON в приложении .Net 5. Параметры по умолчанию, которые я представляю, - Microsoft.AspNet.Mvc.Formatters.Json, Microsoft.Extensions.Configuration.Json и Newtonsoft.Json, когда я использую Visual Studio 2015 Qucik Actions на Json. Я понимаю, что Configuration.Json предназначен для чтения формы appsettings.json, поэтому, вероятно, это не то, что я хотел бы использовать для создания объекта JSON. Я не могу найти никакой реальной информации о Formatters.Json, о том, как ее использовать, или о том, что она предназначена для использования. Newtonsoft.Json будет задокументирован, но лучше ли он над Formatters.Json? Какой из двух я должен использовать?Создание объекта JSON в ASP.Net

+1

Это было предложено (и ответил) много раз. На мой взгляд, лучшим вариантом (производительность, функции, поддержка и т. Д.) Является использование [Json.Net] (http://www.newtonsoft.com/json). Просто добавьте его в файл bower, и вы настроены. Обратите внимание, что дублированный вопрос касается .NET 4, но по-прежнему применяется к ядру ASP.NET. –

+0

@ LeonardoHerrera Это не дубликат. .Net 4 и .Net имеют разные пакеты, два из которых новы для .Net 5. Да, Netwonsoft для .Net 4, но два других не так, лучший способ может быть изменен для .Net 5 – Matthew

+0

Hm. Пожалуйста, лучше сформулируйте свой вопрос: * Я не уверен, какой из них я должен использовать для создания объекта Json *, это не вопрос a/b, так как есть много вариантов. Вы * попробовали * Json.Net? –

ответ

4

Взятые непосредственно из ASP.NET Core 1 tests

 
var expected = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { foo = "abcd" })); 

Также приняты from the tests и слегка модифицирован, назовем его с HttpClient, чтобы увидеть, как отправить ваш json на сервер.

 
var response = await Client.PostAsync(
       "http://localhost/api/ActionUsingSpecificFormatters", 
       new StringContent(yourJsonContent, Encoding.UTF8, "application/json")); 

По Newtonsoft вы можете просто кодировать, а затем делать все, что вы хотите после этого.

 
Product product = new Product(); 
product.Name = "Apple"; 
product.ExpiryDate = new DateTime(2008, 12, 28); 
product.Price = 3.99M; 
product.Sizes = new string[] { "Small", "Medium", "Large" }; 

string output = JsonConvert.SerializeObject(product); 
//{ 
// "Name": "Apple", 
// "ExpiryDate": "2008-12-28T00:00:00", 
// "Price": 3.99, 
// "Sizes": [ 
// "Small", 
// "Medium", 
// "Large" 
// ] 
//} 

Product deserializedProduct = JsonConvert.DeserializeObject(output); 

Вводя это вместе - я только что испытал это. Имейте в виду, что это реальный общий проход через тест с MVC 6 (ASP.NET 5 т.е. ASP.NET ядра 1) :)

 
[HttpGet] 
public async Task<string> Get() 
{ 
    var client = new HttpClient(); 
    var customer = new Customer() { Name = "Schmo", Address = "1999 Purple Rain St" }; 

    var customerJson = JsonConvert.SerializeObject(customer); 
    var response = await client.PostAsync(
        "http://localhost:4815/api/Customer", 
        new StringContent(customerJson, Encoding.UTF8, "application/json")); 


    //just some template output to test which I'm getting back. 
    string resultJson = "{ 'Name':'adam'}"; 

    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     resultJson = await response.Content.ReadAsStringAsync(); 
     var updatedCustomer = JsonConvert.DeserializeObject(resultJson); 
    } 


    return resultJson; 
} 

public class Customer 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

+0

Ваши первые предложения не применяются, поскольку они устарели. Ваша ссылка на учебник WebAPI 2, и я не прошу WebAPI 2. В ASP.Net 5 'HttpClient' имеет метод' PostAsync', а не 'PostAsJsonAsync'. И мне удалось найти много информации о Netwonsoft, но почти нет в «Formatters.Json», поэтому я не был уверен, что нам лучше. – Matthew

+0

Первое предложение заключалось в вызове webapi от клиента - что, по-вашему, вы делаете - ваш клиент asp..net - нет? ASP.NET 5 имеет json.net с ним (в наших шаблонах ящиков) - для него была выпущена только новая версия. –

+0

Да, но половина вашего ответа по-прежнему не так. 'HttpClient' больше не имеет' PostAsJsonAsync', так что учебник не будет работать. – Matthew

1

вы должны использовать NewtonSoft.Json, если вам нужно сериализовать объекты, как JSON

+0

Можете ли вы рассказать о том, почему этот, а не «Форттерс.Джон»? На 'Formatters.Json' нет подробной информации о деталях, поэтому я не могу сравнивать/сравнивать их, – Matthew

+0

На самом деле я был, вероятно, слишком поспешным с моим ответом, под капотом Formatters.Json использует Newtonsoft.Json, поэтому я думаю, что вы могли бы используйте один, но, вероятно, следует просто использовать Formatters.Json, если вам не нужно что-то делать –

+0

Есть ли у вас примеры использования 'Formatters.Json'? Я не могу сделать «Go To Definitions» на нем, и я не получаю Intellisense в его методах перегрузки. – Matthew

1

Я хотел бы использовать Json.NET для создания JSON полезной нагрузки точно (Afterall , Microsoft делает для Web Api).

NuGet Пакет Источник:

Install-Package Newtonsoft.Json 

Вот пример. Если вы хотите вызвать REST api, который возвращает продукт, когда вы делаете GET-вызов, вы можете сделать что-то вроде этого.

public static class Main 
{ 
    string url = "https://TheDomainYouWantToContact.com/products/1"; 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    request.Method = "GET"; 
    request.ContentType = "application/json"; 
    request.Accept = "application/json"; 
    var httpResponse = (HttpWebResponse)request.GetResponse(); 

    var dataStream = httpResponse.GetResponseStream(); 
    var reader = new StreamReader(dataStream); 
    var responseFromServer = reader.ReadToEnd(); 
    reader.Close(); 
    dataStream.Close(); 

    // This is the code that turns the JSON string into the Product object. 
    Product productFromServer = JsonConvert.Deserialize<Product>(responseFromServer); 
    Console.Writeline(productFromServer.Id); 
} 

// This is the class that represents the JSON that you want to post to the service. 
public class Product 
{ 
    public string Id { get; set; } 
    public decimal Cost { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

Точно такой же метод может использоваться и для POST и PUT.

Вы можете использовать сторонние сборки, чтобы сделать это очень просто. Мы авторы DynamicApis.Api

Install-Package DynamicApis.Api 

код, чтобы сделать тот же самый запрос с помощью этого клиента будет:

public static class Main 
{ 
    RestClient client = new RestClient(); 
    string url = "https://YourDomain.com/products/1"; 
    var productFromServer = client.Get<Product>(url); 
    Console.Writeline(productFromServer.Id); 
} 
-1

Вы не должны делать ничего особенного, чтобы отправить данные обратно JSon. Выход по умолчанию форматировщик уже Json, и если ваш Startup.cs файл несколько нормально, вы должны иметь строку, подобную этой:

services.AddMvc(); 

По умолчанию это уже содержит форматировщик JSon, и контроллер должен автосогласовать тип возврата в зависимости от того, что задал браузер.Таким образом, контроллер, как должно работать (из this Github issue, который содержит информацию о том, почему/как эта работа):

public class ValuesController : ApiController 
{ 
    public SomeClass Get() 
    { 
     return new SomeClass(); 
    } 

    public SomeClass Post([FromBody] SomeClass x) 
    { 
     return x; 
    } 
} 
+0

Предполагая, что этот объект Json всегда будет передан моему собственному приложению, а указанное приложение имеет API. Хотя ваш ответ работает в этом случае, он не работает во всех случаях. В этом случае JSON будет либо передан API от третьего лица, либо в ответ JavaScript AJAX. – Matthew

+0

Тогда я в затруднении. Почему вы спрашиваете форттера Json? –

+0

Я чувствую, что ваш вопрос пришел со слишком большим количеством багажа. Что тебе нужно сделать*? Поместить некоторые данные Json в сторонний API? Если да, то * вы должны использовать Json.Net *. –

Смежные вопросы