Как разбирать JSON без библиотеки JSON.NET?

Я пытаюсь создать приложение 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"
}

Ответ 1

Вы можете использовать классы, найденные в 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.

Ответ 2

Я использую это... но никогда не делал разработку приложений для метро, ​​поэтому я не знаю никаких ограничений на доступные вам библиотеки. (обратите внимание: вам нужно будет пометить свои классы, как с атрибутами 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);

Ответ 3

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

Ответ 4

Для тех, у кого нет 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;

Ответ 5

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

Ответ 6

Я выпустил библиотеку .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