Как создать строку JSON в C #

238

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

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

Ответы:

249

Вы можете использовать класс 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();
CMS
источник
да, просто пытаюсь понять, как сначала сформировать текст JSON. Спасибо
PositiveGuy
Что делать, если вы не используете .NET 3.5! да ** это
PositiveGuy
2
JavaScriptSerializer является частью ASP.NET Ajax 1.0, если вы хотите использовать его из .NET 2.0.
Джо Чунг
2
Вы все еще можете использовать его. Это часть ASP.NET 2.0 AJAX Extensions 1.0: asp.net/AJAX/Documentation/Live/mref/…
Нарен
наш проект может открыться в VS 2008 ... так что он был преобразован в какой-то момент. Означает ли это, что теперь мы можем использовать .NET 3.5 в нашей существующей базе кода?
PositiveGuy
366

Использование 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

Орр
источник
8
MS теперь поставляет NewtonSoft как стандарт в шаблоне проекта VS MVC4
Крис Ф. Кэрролл,
45
Вы также можете сериализовать анонимные объекты при необходимости: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Мэтт Бекман
9
@MattBeckman Я получаю «Недопустимый декларатор члена анонимного типа. Члены анонимного типа должны быть объявлены с назначением члена, простым именем или доступом к члену. Не должно "PropertyA"быть PropertyA
Иона
Поэтому нам нужно реализовать класс и объекты, чтобы построить простой json! Представьте себе вложенные - не фиксированные массивы - элементы. Я не понимаю, почему в воздухе столько энтузиазма!
Василис
6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });без двойных кавычекPropertyA.
Хосе
18

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

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

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

Одновременно используйте библиотеки Newtonsoft.Json и Newtonsoft.Json.Linq .

        //Create my object
        var my_jsondata = new
        {
            Host = @"sftp.myhost.gr",
            UserName = "my_username",
            Password = "my_password",
            SourceDir = "/export/zip/mypath/",
            FileName = "my_file.zip"
        };

        //Tranform it to Json object
        string json_data = JsonConvert.SerializeObject(my_jsondata);

        //Print the Json object
        Console.WriteLine(json_data);

        //Parse the json object
        JObject json_object = JObject.Parse(json_data);

        //Print the parsed Json object
        Console.WriteLine((string)json_object["Host"]);
        Console.WriteLine((string)json_object["UserName"]);
        Console.WriteLine((string)json_object["Password"]);
        Console.WriteLine((string)json_object["SourceDir"]);
        Console.WriteLine((string)json_object["FileName"]);
Доктор К
источник
Просто и удобно. Спасибо.
QMaster
13

Этот фрагмент кода использует 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());
    }
}
Джо Чунг
источник
3
Так что ... раскомментируйте ссылку "this", чтобы фактически заставить этот фрагмент работать. Если вы раньше не работали с методами расширения, это может быть неочевидно.
Дэн Эспарза
7

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

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

Вы также можете попробовать мой ServiceStack JsonSerializer - это самый быстрый сериализатор .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 JavaScriptSerializer только в том случае, если для вас не важна производительность, поскольку мне пришлось исключить ее из своих тестов, поскольку она в 40–100 раз медленнее, чем в других сериализаторах JSON.

mythz
источник
Я попробовал JsonSerializer.SerializeToString со списком объектов, и он просто возвратил пустой json: "[{}, {}]" pastebin.com/yEw57L3T Вот как выглядит мой объект перед тем, как я вызываю SerializeToString i.imgur.com/dYIE7J1.png Ответ с верхним голосованием здесь сработал, вернув то, что я ожидал: pastebin.com/aAtB3Gxu
Matthew Lock
Самая быстрая ссылка .NET JSON serializer не работает.
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\"}}"

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

Тонкая лиса
источник
5

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

Тамас Чинеге
источник
1
Я пробовал JavaScriptSerializer, и он не работает хорошо с нулевыми объектами.
Luke101
1
@ Luke101: Как именно? Я имею в виду, я использую это каждый день и никогда не было проблем, так что мне честно любопытно (без иронии, мне действительно любопытно, потому что я никогда не сталкивался с проблемами)
Тамас Чинег
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"
PositiveGuy
1

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

Стив
источник
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: "getData.asmx / GetLatLon", как я ожидаю, метод GetLatLon в вашем коде на стороне сервера. Но нет.
Лали
1

Кодирование использования

Простой объект в массив 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, "mike"], [5, "dummy"]]

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

Довольно распечатать 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"
      ]
   ]
]
Судхакар Рао
источник