从json字符串中检索值

我有json字符串。 我想从json字符串中检索contact 。 以下json包含联系人array 。 这是我的json字符串。

 {   "contacts": {      "contact": [         {            "isConnection": false,            "id": 33554611,            "fields": [               {                  "id": 33554748,                  "type": "name",                  "value": {                     "givenName": "Jhon",                     "middleName": "",                     "familyName": "Scot",                     "prefix": "",                     "suffix": "",                     "givenNameSound": "",                     "familyNameSound": ""                  },                  "editedBy": "OWNER",                  "flags": [],                  "categories": [],                  "updated": "2012-12-23T07:40:23Z",                  "created": "2012-12-23T07:40:23Z",               },               {                  "id": 33554749,                  "type": "email",                  "value": "someone@example.com",                  "editedBy": "OWNER",                  "flags": [],                  "categories": [],                  "updated": "2012-12-23T07:40:23Z",                  "created": "2012-12-23T07:40:23Z",               }            ]         } } } 

在这里,我想检索givenName,familyName,email的值。 如何从json字符串中检索这些值。

注意:json中有一系列contact 。 我只发布了这个json的一个联系人。

我试过这样的事。 但没有奏效。

 JObject json = JObject.Parse(returnStr); JArray fields = (JArray)json["contacts"]["contact"]["fields"][0]; JArray FValues = (JArray)json["contact"]["fields"]["value"]; 

我试过这个

 public class Field { public int id { get; set; } public string type { get; set; } public object value { get; set; } public string editedBy { get; set; } public List flags { get; set; } public List categories { get; set; } public string updated { get; set; } public string created { get; set; } public string uri { get; set; } public bool? isConnection { get; set; } } public class contact { public bool isConnection { get; set; } public int id { get; set; } public List fields { get; set; } public List categories { get; set; } public int error { get; set; } public int restoredId { get; set; } public string created { get; set; } public string updated { get; set; } public string uri { get; set; } } public class Contacts { public List contact { get; set; } public int count { get; set; } public int start { get; set; } public int total { get; set; } public string uri { get; set; } public bool cache { get; set; } } public class RootObject { public Contacts contacts { get; set; } } 

 JavaScriptSerializer serializer1 = new JavaScriptSerializer(); RootObject obje = serializer1.Deserialize(returnStr); 

但它在obje给了我0值。

  1. 首先使用jsonlint确保您的Json处于有效格式

  2. 然后使用json2csharp在其上生成类

     public class Field { public int id { get; set; } public string type { get; set; } public object value { get; set; } public string editedBy { get; set; } public List flags { get; set; } public List categories { get; set; } public string updated { get; set; } public string created { get; set; } } public class Contact { public bool isConnection { get; set; } public int id { get; set; } public List fields { get; set; } } public class Contacts { public List contact { get; set; } } public class RootObject { public Contacts contacts { get; set; } } 
  3. 使用Newtonsoft JSON将Json反序列化为对象,然后您可以只访问其属性值。

     JsonConvert.DeserializeObject(string json); 

json对象的类(在纠正一些语法错误后使用http://jsonutils.com/生成):

 public class Field { public int id { get; set; } public string type { get; set; } public object value { get; set; } public string editedBy { get; set; } public IList flags { get; set; } public IList categories { get; set; } public DateTime updated { get; set; } public DateTime created { get; set; } } public class Contact { public bool isConnection { get; set; } public int id { get; set; } public IList fields { get; set; } } public class Contacts { public IList contact { get; set; } } public class Example { public Contacts contacts { get; set; } } 

反序列化(您可能需要添加对System.Web.Extensions的引用):

 System.Web.Script.Serialization.JavaScriptSerializer deSer = new System.Web.Script.Serialization.JavaScriptSerializer(); JSonPrintSettingsToXml.Input.Example deserializedJSON = deSer.Deserialize(yourJSON); 

这是更正的JSON

 { "contacts": { "contact": [ { "isConnection": false, "id": 33554611, "fields": [ { "id": 33554748, "type": "name", "value": { "givenName": "Jhon", "middleName": "", "familyName": "Scot", "prefix": "", "suffix": "", "givenNameSound": "", "familyNameSound": "" }, "editedBy": "OWNER", "flags": [], "categories": [], "updated": "2012-12-23T07:40:23Z", "created": "2012-12-23T07:40:23Z" }, { "id": 33554749, "type": "email", "value": "someone@example.com", "editedBy": "OWNER", "flags": [], "categories": [], "updated": "2012-12-23T07:40:23Z", "created": "2012-12-23T07:40:23Z" } ] } ] } } 

您需要使用以下结构:

 public class Contact { public bool isConnection { get; set; } public int id { get; set; } public List fields { get; set; } } public class Field { public int id { get; set; } public string type { get; set; } public object value { get; set; } public string editedBy { get; set; } public string[] flags { get; set; } public string[] categories { get; set; } public DateTime updated { get; set; } public DateTime created { get; set; } } public class Name { public string givenName { get; set; } public string middleName { get; set; } public string familyName { get; set; } public string prefix { get; set; } public string suffix { get; set; } public string givenNameSound { get; set; } public string familyNameSound { get; set; } } 

然后反序列化它并使用LINQ来操作字段。

如果您想坚持使用JObject而不是创建类,请查看http://weblog.west-wind.com/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing中提供的示例。

你必须列举这一点

 dynamic contacts = (JArray)json["contacts"] foreach(dynamic contact in contacts.contact) { // look at the fields... } 

PS。 试一试,没有我的VS所以不能确切地validation确切的语法

首先,我认为你会发现你的JSON格式不正确。 在两个“创建”日期之后,您不需要额外的逗号,并且在第二个最后一个大括号之前缺少右方括号。 我建议你总是使用这个很棒的网站validation你的JSON: http : //jsonformatter.curiousconcept.com

其次,您没有正确引用数组元素。 虽然我同意@grundy你应该创建用于管理JSON和使用LINQ的类定义,但Newtonsoft库绝对没有任何问题。 您仍然可以坚持使用您的方法。

试试这个:-

 var json = JObject.Parse(returnStr); var fields = (JArray)json["contacts"]["contact"][0]["fields"]; var givenName = fields[0]["value"]["givenName"]; var familyName = fields[0]["value"]["familyName"]; var email = fields[1]["value"];