Как разобрать JSON без библиотеки JSON.NET? - PullRequest
68 голосов
/ 05 марта 2012

Я пытаюсь создать приложение Metro для Windows 8 на Visual Studio 2011. И хотя я пытаюсь это сделать, у меня возникают некоторые проблемы с анализом JSON без JSON.NET библиотеки (пока не поддерживает приложения метро).

В любом случае, я хочу разобрать это:

{
   "name":"Prince Charming",
   "artist":"Metallica",
   "genre":"Rock and Metal",
   "album":"Reload",
   "album_image":"http:\/\/up203.siz.co.il\/up2\/u2zzzw4mjayz.png",
   "link":"http:\/\/f2h.co.il\/7779182246886"
}

Ответы [ 6 ]

91 голосов
/ 06 марта 2012

Вы можете использовать классы, найденные в System.Json Namespace , которые были добавлены в .NET 4.5. Вам необходимо добавить ссылку на System.Runtime.Serialization сборка

Метод JsonValue.Parse () анализирует текст JSON и возвращает JsonValue :

JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");

Если вы передадите строку с объектом JSON, вы сможете преобразовать значение в JsonObject :

using System.Json;


JsonObject result = value as JsonObject;

Console.WriteLine("Name .... {0}", (string)result["name"]);
Console.WriteLine("Artist .. {0}", (string)result["artist"]);
Console.WriteLine("Genre ... {0}", (string)result["genre"]);
Console.WriteLine("Album ... {0}", (string)result["album"]);

Классы очень похожи на классы System.Xml.Linq Namespace .

31 голосов
/ 06 марта 2012

Я использую это ... но никогда не занимался разработкой приложений для метро, ​​поэтому я не знаю никаких ограничений на доступные вам библиотеки. (обратите внимание, вам нужно пометить ваши классы как атрибуты DataContract и DataMember)

public static class JSONSerializer<TType> where TType : class
{
    /// <summary>
    /// Serializes an object to JSON
    /// </summary>
    public static string Serialize(TType instance)
    {
        var serializer = new DataContractJsonSerializer(typeof(TType));
        using (var stream = new MemoryStream())
        {
            serializer.WriteObject(stream, instance);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    /// <summary>
    /// DeSerializes an object from JSON
    /// </summary>
    public static TType DeSerialize(string json)
    {
        using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
        {
            var serializer = new DataContractJsonSerializer(typeof(TType));
            return serializer.ReadObject(stream) as TType;
        }
    }
}

Итак, если бы у вас был такой класс ...

[DataContract]
public class MusicInfo
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Artist { get; set; }

    [DataMember]
    public string Genre { get; set; }

    [DataMember]
    public string Album { get; set; }

    [DataMember]
    public string AlbumImage { get; set; }

    [DataMember]
    public string Link { get; set; }

}

Тогда вы бы использовали это так ...

var musicInfo = new MusicInfo
{
     Name = "Prince Charming",
     Artist = "Metallica",
     Genre = "Rock and Metal",
     Album = "Reload",
     AlbumImage = "http://up203.siz.co.il/up2/u2zzzw4mjayz.png",
     Link = "http://f2h.co.il/7779182246886"
};

// This will produce a JSON String
var serialized = JSONSerializer<MusicInfo>.Serialize(musicInfo);

// This will produce a copy of the instance you created earlier
var deserialized = JSONSerializer<MusicInfo>.DeSerialize(serialized);
7 голосов
/ 28 февраля 2015

Для тех, у кого нет 4.5, вот моя библиотечная функция, которая читает json.Требуется ссылка проекта на System.Web.Extensions.

using System.Web.Script.Serialization;

public object DeserializeJson<T>(string Json)
{
    JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
    return JavaScriptSerializer.Deserialize<T>(Json);
}

Обычно json выписывается на основании контракта.Этот контракт может и обычно кодифицируется в классе (T).Иногда вы можете взять слово из json и найти объектный браузер, чтобы найти этот тип.

Пример использования:

Учитывая json

{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}

Вы можете разобрать егов RadComboBoxClientState объект, подобный этому:

string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState");
RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson);
return RadComboBoxClientState.Value;
6 голосов
/ 06 марта 2012

Вы пробовали использовать JavaScriptSerializer?Там также DataContractJsonSerializer

1 голос
/ 06 марта 2012

Вы можете использовать DataContractJsonSerializer.См. ссылку для более подробной информации.

0 голосов
/ 15 декабря 2016

Я выпустил библиотеку .NET под названием Tiferix.Json, которая позволяет сериализовать и десериализовать файлы Json в и из объектов ADO.Net DataSet и DataTable. Этот проект находится в стадии разработки, и в ближайшие 6 месяцев (надеюсь) я расширю функциональность, чтобы позволить сериализацию различных типов .Net-классов и объектов, включая динамические классы и анонимные типы. На данный момент библиотека Tiferix.Json не имеет необработанного JsonDataReader, но имеет довольно мощный класс JsonDataWriter, который может записывать файлы Json тем же способом, что и .NET Binary или StreamWriter. JsonDataWriter библиотеки Tiferix.Json также имеет возможность автоматически идентифицировать ваши файлы Json, что является очень полезной функцией, которую я не видел ни в одной другой библиотеке Json, включая Json.Net.

Если вам интересно, вы можете просмотреть проект Tiferix.Json на моей странице Github и загрузить библиотеки и библиотеки DLL. Tiferix.Json предлагает гораздо более простую и легкую альтернативу более полной библиотеке Json.Net, а также менее жесткую и простую в использовании (на мой взгляд), чем нативные классы .Net Json.

Библиотека Tiferix Json

...