解析包含数组的JSON对象在Windows Phone 7上

3

好的,我对此有些困难。

我的JSON格式如下

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

我试图按照这个教程做,但由于JSON格式不同,没有成功。
我需要在这个方法中输入什么内容呢? 我不知道是创建一个“wrap”类来包含我的列表还是直接使用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
3个回答

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; }
}

@Mike_G OP也没有使用DataContractJsonSerializer。我只看到DataContractJsonSerializer ser = null;这一行。这是你对一个可用的代码投反对票的唯一解释吗? - L.B
是的,它有效!非常感谢!如果有人需要一个字符串(像我一样),只需将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);

这是我凭空写出来的,所以可能不能通过复制和粘贴进行编译,但它应该作为一个样本可以工作。


-1 不起作用,因为OP的JSON字符串不是数组或列表。很容易测试。 - L.B
注意到需要一个根类。@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);

-1 不起作用,因为OP的JSON字符串不是数组或列表。很容易测试。 - L.B
当然不行,这不是一个程序啦。他不是想让别人替他完成,而是询问下一步应该怎么做。正如你所看到的,我演示了两个主要组件来完全实现他的任务。有些人真是……(笑)。 - Mike_G
你的回答试图将OP的JSON字符串反序列化为列表而不是根对象,然后你说“当然不起作用”。这是一个好的策略来回答问题。只需随便写点什么,因为你并不指望它能运行。哈哈 - L.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接