【问题标题】:Json Deserializer read objects to arrayJson Deserializer 将对象读取到数组
【发布时间】:2012-07-13 15:39:36
【问题描述】:

我正在编写一个反序列化器回调方法来解析 C# silverlight 中的一些 Json 响应。

但问题是响应是由一堆对象构造的,而不是数组形式。

具体来说,通常当我们想要从 json 中解析某些内容时,如果这是一个对象列表,它在某些 Json 可视化工具中会如下所示:

我们可以这样做:

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ObjType[]));
ObjType[] response = (ObjType[])jsonSerializer.ReadObject(stream);

但现在我有结构如下的 Json 文件:

在这种情况下,我认为我不能将其解析为数组,因为对象是单独的,而不是数组结构。

Json 文件的示例是:

[
   {
      "Name":"Mike",
      "Gender":"male",
   },
   {
      "Name":"Lucy",
      "Gender":"Female ",
   },
   {
      "Name":"Jack",
      "Gender":"Male",
   }
]

所以我想知道是否有任何方法可以将这种 Json 文件解析为已定义对象的数组。

【问题讨论】:

  • 能否将示例 json 分享为文本
  • 您可以使用 JSON.NET 将 json 反现实化为匿名对象stackoverflow.com/questions/6904825/…
  • @raman 抱歉,我无法以文本形式共享 Json 文件,因为这不是公共资源。但我可以尝试在相同的结构中制作一些假数据

标签: c# json silverlight parsing deserialization


【解决方案1】:

这对我有用

string json = @"[
    {
        ""Name"":""Mike"",
        ""Gender"":""male""
    },
    {
        ""Name"":""Lucy"",
        ""Gender"":""Female ""
    },
    {
        ""Name"":""Jack"",
        ""Gender"":""Male""
    }
]";
MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ObjType[]));
ObjType[] response = (ObjType[])jsonSerializer.ReadObject(stream);

-

[DataContract]
public class ObjType
{
    [DataMember]
    public string Name;
    [DataMember]
    public string Gender;
}

【讨论】:

    【解决方案2】:
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class RootClass
    {
    
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Name;
    
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Gender;
    }
    
        static void Main(string[] args)
        {
           var serializer = new DataContractJsonSerializer(typeof(RootClass[]));
            serializer.ReadObject(/*Input stream w/ JSON*/);
    
        }
    

    【讨论】:

    • 示例输入流:new FileStream("E:\\sample.txt", FileMode.Open)
    • 注意你的样本中有多余的逗号
    【解决方案3】:
    public static T JSONDeserialize<T>(string json)
            {
                T obj = default(T);
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
                {
                    obj = Activator.CreateInstance<T>();
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                    obj = (T)serializer.ReadObject(ms);
                    ms.Close();
                }`enter code here`
                return obj;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2012-04-19
      • 2014-08-10
      相关资源
      最近更新 更多