从json字符串中检索值

本文关键字:检索 字符串 json | 更新日期: 2023-09-27 17:50:41

我有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"];

I tried this

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<object> flags { get; set; }
        public List<object> 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<Field> fields { get; set; }
        public List<object> 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> 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<RootObject>(returnStr);

但是它在obje中给我0值

从json字符串中检索值

  1. 首先使用jsonlint

  2. 确保Json格式有效
  3. 然后使用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<object> flags { get; set; }
        public List<object> 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<Field> fields { get; set; }
    }
    public class Contacts
    {
        public List<Contact> contact { get; set; }
    }
    public class RootObject
    {
        public Contacts contacts { get; set; }
    }
    
  4. 使用Newtonsoft JSON将JSON反序列化为对象,然后您可以简单地访问其属性值。

    JsonConvert.DeserializeObject<RootObject>(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<object> flags { get; set; }
    public IList<object> 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<Field> fields { get; set; }
}
public class Contacts
{
    public IList<Contact> 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<JSonPrintSettingsToXml.Input.Example>(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<Field> 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... 
}

p。试一试,我没有VS所以不能验证确切的语法

首先,我认为您会发现JSON格式不佳。您不需要在两个"已创建"日期之后使用额外的逗号,并且在最后一个大括号之前缺少一个右方括号。我建议你总是使用这个很棒的网站验证你的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"];