【问题标题】:How to parse this String using System.Runtime.Serialization.Json?如何使用 System.Runtime.Serialization.Json 解析这个字符串?
【发布时间】:2013-04-09 05:40:14
【问题描述】:

你能帮我如何使用System.Runtime.Serialization.Json不是Json.NET)来获取这个数组中每本书的信息:

{
    "books":
    [
        {"name":"Book 1","orig":"Author 1","date":2009,"lang":"en"},
        {"name":"Book 2","orig":"Author 2","date":2012,"lang":"fr"}
    ],
    "src":"lib",
    "id":212
}

【问题讨论】:

    标签: c# json parsing


    【解决方案1】:

    这是我快速制作的一个似乎有效的示例:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    
    class Test
    {
        static void Main()
        {
            using (Stream stream = File.OpenRead("test.json"))
            {
                var serializer = new DataContractJsonSerializer(typeof(Library));
                Library library = (Library) serializer.ReadObject(stream);
                Console.WriteLine(library.Books[0].Name);
            }
    
        }
    }
    
    [DataContract]
    class Book
    {
        [DataMember(Name="name")] public string Name { get; set; }
        [DataMember(Name="orig")] public string Orig { get; set; }
        [DataMember(Name="date")] public string Date { get; set; }
        [DataMember(Name="lang")] public string Lang { get; set; }
    }
    
    [DataContract]
    class Library
    {
        [DataMember(Name="books")] public IList<Book> Books { get; set; }
        [DataMember(Name="src")] public string Src { get; set; }
        [DataMember(Name="id")] public string Id { get; set; }
    }
    

    我确信您可以调整很多其他选项,但这至少应该可以帮助您入门。

    【讨论】:

    • 谢谢,如果在其他字符串中有"score":9.080557e-06 但我无法解析它。我无法解析到什么类型?
    • @TuyenTk:看起来您应该能够将其解析为double
    【解决方案2】:

    通用方法:

    using System.IO;
    using System.Runtime.Serialization.Json;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace YourApp.Helpers
    {
        public class SystemSerializer:ISerializer
        {
            public T Deserialize<T>(string json) where T : class
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
    
                using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
                {
                    return ser.ReadObject(ms) as T;
                }
            }
    
            public T Deserialize<T>(Stream json) where T : class
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
                return ser.ReadObject(json) as T;
            }
    
            public async Task<string> SerializeAsync<T>(T obj) where T : class
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
                using (var ms = new MemoryStream())
                {
                    ser.WriteObject(ms, obj);
                    ms.Position = 0;
                    using (var sr = new StreamReader(ms))
                    {
                        return await sr.ReadToEndAsync();
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多