Вопрос по json, c#, asp.net – Как создать строку JSON в C #

201

Я просто использовал XmlWriter для создания некоторого XML для отправки обратно в ответ HTTP. Как бы вы создали строку JSON. Я предполагаю, что вы просто используете string Builder для построения строки JSON, и они форматируют ваш ответ как JSON?

Отметьте 3 способа преобразования данных в строку JSON в Asp.net C #codepedia.info/2015/07/… Satinder singh

Ваш Ответ

12   ответов
1

Я обнаружил, что вам вообще не нужен сериализатор. Если вы возвращаете объект в виде списка. Позвольте мне привести пример.

В нашем asmx мы получаем данные, используя переменную, которую мы передали

// return data
[WebMethod(CacheDuration = 180)]
public List<latlon> GetData(int id) 
{
    var data = from p in db.property 
               where p.id == id 
               select new latlon
               {
                   lat = p.lat,
                   lon = p.lon

               };
    return data.ToList();
}

public class latlon
{
    public string lat { get; set; }
    public string lon { get; set; }
}

Затем, используя jquery, мы получаем доступ к сервису, передавая эту переменную.

// get latlon
function getlatlon(propertyid) {
var mydata;

$.ajax({
    url: "getData.asmx/GetLatLon",
    type: "POST",
    data: "{'id': '" + propertyid + "'}",
    async: false,
    contentType: "application/json;",
    dataType: "json",
    success: function (data, textStatus, jqXHR) { //
        mydata = data;
    },
    error: function (xmlHttpRequest, textStatus, errorThrown) {
        console.log(xmlHttpRequest.responseText);
        console.log(textStatus);
        console.log(errorThrown);
    }
});
return mydata;
}

// call the function with your data
latlondata = getlatlon(id);

И мы получаем наш ответ.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
url: & quot; getData.asmx / GetLatLon & quot ;, как я ожидаю, метод GetLatLon в вашем коде на стороне сервера. Но нет.
230

Вы могли бы использоватьКласс JavaScriptSerializer, проверятьЭта статья построить полезный метод расширения.

Код из статьи:

namespace ExtensionMethods
{
    public static class JSONHelper
    {
        public static string ToJSON(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static string ToJSON(this object obj, int recursionDepth)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RecursionLimit = recursionDepth;
            return serializer.Serialize(obj);
        }
    }
}

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

using ExtensionMethods;

...

List<Person> people = new List<Person>{
                   new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"},
                   new Person{ID = 2, FirstName = "Bill", LastName = "Gates"}
                   };


string jsonString = people.ToJSON();
да, просто пытаюсь понять, как сначала сформировать текст JSON. Спасибо PositiveGuy
JavaScriptSerializer является частью ASP.NET Ajax 1.0, если вы хотите использовать его из .NET 2.0.
Вы все еще можете использовать его. Его часть ASP.NET 2.0 AJAX Extensions 1.0:asp.net/AJAX/Documentation/Live/mref/…
Что делать, если вы не используете .NET 3.5! да ** это PositiveGuy
Я вижу, передать ваш объект в PositiveGuy
7

Вы также можете попробовать мой ServiceStackJsonSerializer этосамый быстрый .NET JSON сериализатор в данный момент. Он поддерживает сериализацию DataContracts, любых типов POCO, интерфейсов, объектов с поздним связыванием, включая анонимные типы и т. Д.

Основной пример

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

Примечание. Используйте MicrosoftSoftizer JavaScript только в том случае, если производительность не важна для вас, поскольку я вынужден был исключить ее из моих тестов, поскольку до40x-100x медленнее, чем другие сериализаторы JSON.

Самая быстрая ссылка .NET JSON serializer не работает.
Я попробовал JsonSerializer.SerializeToString со списком объектов, и он просто возвратил пустой json: & quot; [{}, {}] & quot;pastebin.com/yEw57L3T  Вот как выглядит мой объект перед тем, как я вызову SerializeToStringi.imgur.com/dYIE7J1.png Ответ с верхним голосованием здесь сработал, вернув то, что я ожидал:pastebin.com/aAtB3Gxu
1

Encode Usage

Простой объект в массив JSON EncodeJsObjectArray ()

public class dummyObject
{
    public string fake { get; set; }
    public int id { get; set; }

    public dummyObject()
    {
        fake = "dummy";
        id = 5;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append('[');
        sb.Append(id);
        sb.Append(',');
        sb.Append(JSONEncoders.EncodeJsString(fake));
        sb.Append(']');

        return sb.ToString();
    }
}

dummyObject[] dummys = new dummyObject[2];
dummys[0] = new dummyObject();
dummys[1] = new dummyObject();

dummys[0].fake = "mike";
dummys[0].id = 29;

string result = JSONEncoders.EncodeJsObjectArray(dummys);

Результат: [[29, & Quot; микрофон & Quot;], [5, & Quot; фиктивная & Quot;]]

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

Довольно распечатать JSON Array PrettyPrintJson () метод расширения строки

string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();

Результаты:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
1

DataContractJsonSerializer сделает все для вас так же просто, как XMLSerializer. Это тривиально, чтобы использовать это в веб-приложении. Если вы используете WCF, вы можете указать его использование с атрибутом. Семейство DataContractSerializer также очень быстро.

11

Этот фрагмент кода использует DataContractJsonSerializer из System.Runtime.Serialization.Json в .NET 3.5.

public static string ToJson<T>(/* this */ T value, Encoding encoding)
{
    var serializer = new DataContractJsonSerializer(typeof(T));

    using (var stream = new MemoryStream())
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding))
        {
            serializer.WriteObject(writer, value);
        }

        return encoding.GetString(stream.ToArray());
    }
}
Так что ... раскомментируйте «это» ссылка, чтобы на самом деле получить этот фрагмент работает. Если вы раньше не работали с методами расширения, это может быть неочевидно.
335

С помощьюNewtonsoft.Json делает это действительно проще:

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

string json = JsonConvert.SerializeObject(product);

Документация:Сериализация и десериализация JSON

MS теперь поставляет NewtonSoft как стандарт в шаблоне проекта VS MVC4
Поэтому нам нужно реализовать класс и объекты, чтобы построить простой json! Представьте себе вложенные - не фиксированные массивы - элементы. Я не могу понять, почему в воздухе столько энтузиазма!
@VassilisGr, на мой взгляд, гораздо безопаснее и лучше создавать классы и создавать их экземпляры, это делает ваш API более понятным и задокументированным. Существуют и другие способы создания строк JSON "на лету". однако, если это то, что вы предпочитаете.
Вы также можете при необходимости сериализовать анонимные объекты:string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
@MattBeckman Я получаю & quot; Неверный декларатор члена анонимного типа. Члены анонимного типа должны быть объявлены с назначением члена, простым именем или доступом члена. & APOS не должен; т"PropertyA" бытьPropertyA?
7

Взгляни наhttp://www.codeplex.com/json/ для проекта json-net.aspx. Зачем заново изобретать колесо?

зависит, возможно, я не хочу полагаться на сторонний плагин с открытым исходным кодом только для создания JSON. Я предпочел бы сам создать метод string / helper. PositiveGuy
5

Если вы не можете или не хотите использовать два встроенных сериализатора JSON (JavaScriptSerializer а такжеDataContractJsonSerializer) вы можете попробоватьJsonExSerializer библиотека - я использую ее в ряде проектов и работает довольно хорошо.

Я пробовал JavaScriptSerializer, и он не работает хорошо с нулевыми объектами.
@ Luke101: Как именно? Я имею в виду, я использую его каждый день и никогда не было проблем, поэтому мне, честно говоря, любопытно! (без иронии, мне действительно любопытно, потому что я никогда не сталкивался с проблемами)
6

Если вам нужен сложный результат (встроенный), создайте свою собственную структуру:

class templateRequest
{
    public String[] registration_ids;
    public Data data;
    public class Data
    {
        public String message;
        public String tickerText;
        public String contentTitle;
        public Data(String message, String tickerText, string contentTitle)
        {
            this.message = message;
            this.tickerText = tickerText;
            this.contentTitle = contentTitle;
        }                
    };
}

и тогда вы можете получить строку JSON с вызовом

List<String> ids = new List<string>() { "id1", "id2" };
templateRequest request = new templeteRequest();
request.registration_ids = ids.ToArray();
request.data = new templateRequest.Data("Your message", "Your ticker", "Your content");

string json = new JavaScriptSerializer().Serialize(request);

Результат будет таким:

json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"

Надеюсь, поможет!

2

Если вы пытаетесь создать веб-сервис для передачи данных через JSON на веб-страницу, рассмотрите возможность использования набора инструментов ASP.NET Ajax:

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

Он автоматически преобразует ваши объекты, обслуживаемые через веб-сервис, в json и создаст прокси-класс, который вы сможете использовать для подключения к нему.

это был бы просто вызов .ashx, который возвращал бы строку JSON. Во-первых, я просто пытаюсь выяснить, как сформировать строку ... использовать StringBuilder? Во-вторых, да, как сериализовать. При возврате XML вы просто задаете тип содержимого ответа, который я считаю: context.Response.ContentType = & text / xml & quot; PositiveGuy
18

Эта библиотека очень хороша для JSON из C #

http://james.newtonking.com/pages/json-net.aspx

позволяет более тонкую гранулярность по json, например, вы можете указать, включать ли нули или нет и т. д.
Позвольте мне спросить, каковы преимущества использования этого фреймворка по сравнению с тем вспомогательным методом, который CMS упоминал выше? PositiveGuy

Похожие вопросы