2012-05-01 76 views
3

好的,我对此有些困难。解析包含Windows Phone 7数组的JSON对象

我的JSON是像

{ "names" : [ {"name":"bla"} , {"name":"bla2"} ] } 

我要怎样做this tutorial但是,由于不同的JSON,它并没有奏效。

我有什么把这个方法里面? 我不知道是否最好创建一个包含我的列表或直接使用JsonObject的“包装”类。你能给我一个片段吗?我在C#中有点新鲜。

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     DataContractJsonSerializer ser = null; 
     try 
     { 
      ??? 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

在此先感谢!

+1

http://json2csharp.com/将成为你的朋友。它根据JSON字符串创建类和成员。它可以节省很多时间! – Gero

回答

6

使用Json.Net(支持的Windows Phone)

string json = @"{ ""names"" : [ {""name"":""bla""} , {""name"":""bla2""} ] }"; 

var dict = (JObject)JsonConvert.DeserializeObject(json); 
foreach (var obj in dict["names"]) 
{ 
    Console.WriteLine(obj["name"]); 
} 

或者,如果你想使用它的类型安全的方式

var dict = JsonConvert.DeserializeObject<RootClass>(json); 
foreach (var obj in dict.names) 
{ 
    Console.WriteLine(obj.name); 
} 


public class RootClass 
{ 
    public MyName[] names { get; set; } 
} 

public class MyName 
{ 
    public string name { get; set; } 
} 
+0

-1。 OP不使用Json.NET –

+0

@Mike_G OP也不使用'DataContractJsonSerializer'。我只看到'DataContractJsonSerializer ser = null;'这是对**工作**代码的downvote的唯一解释吗? –

+0

是的,它的工作原理!非常感谢!如果有人需要一个字符串(就像我),只需把obj [“name”]。ToString()。也许这是白热化的,但正如我所说,我是C#新手! – Enrichman

1

我使用JSON.NET(http://james.newtonking.com/projects/json-net.aspx)正常,所以我的代码可能会略有不同。

对于列表的内容我会去一类的名称属性那样:

public class NameClass { 
    public string name { get;set; } 
} 

那么你应该能够JSON.NET反序列化List<NameClass>

List<NameClass> result = JsonConvert.Deserialize<List<NameClass>>(jsonString); 

这是从我的脑海里写出来的,所以也许它不能用复制和粘贴来编译,但它应该作为一个样本。

+0

-1由于OP的json字符串不是数组或列表,因此不起作用。易于测试 –

+0

已经监督了对根类的需求。 @ L.B:感谢您指出 – Sascha

1

使用.NET DataContractJsonSerializer你需要定义一个类映射json对象。像这样的东西(如果我没记错的话):

/// <summary> 
/// 
/// </summary> 
[DataContract] 
public class Result 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    [DataMember(Name = "name")] 
    public string Name 
    { get; set; } 
} 

/// <summary> 
/// 
/// </summary> 
[DataContract] 
public class Results 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    [DataMember(Name = "names")] 
    public List<Result> Names 
    { get; set; } 
} 

然后在事件处理:

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Results)); 
var results = (Results)serializer.ReadObject(SOME OBJECT HOLDING JSON, USUALLY A STREAM); 
+0

-1由于OP的json字符串不是数组或列表,因此不起作用。易于测试。 –

+0

当然它不工作,它不是一个程序哈哈。他不想为他完成,他问下一步该做什么。正如你所看到的,我展示了完成他的任务的两个主要组件。大声笑,一些人...... –

+0

你的答案试图反序列化OP的json字符串到**列表而不是根对象**,你现在说'当然它不工作。好的政策来回答。随意写任何东西,因为你不希望它运行。大声笑 –