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

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

12 ответов


можно использовать класс 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();

С помощью 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


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

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


этот фрагмент кода использует DataContractJsonSerializer из системы.Во время выполнения.Сериализация.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());
    }
}

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


вы также можете попробовать мой 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); 

Примечание: используйте только Microsofts JavaScriptSerializer, если производительность не важна для вас, поскольку мне пришлось оставить ее вне моих тестов, так как она до 40x-100x медленнее чем другие сериализаторы JSON.


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

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\"}}"

надеюсь, что это помогает!


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


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

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

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


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


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

в нашем 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}]}

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

простой объект для массива 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"]]

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

Pretty print 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"
      ]
   ]
]