Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从json字符串中获取值_C#_Json - Fatal编程技术网

C# 无法从json字符串中获取值

C# 无法从json字符串中获取值,c#,json,C#,Json,我收到的变量content中的json字符串如下: "{\n \"predictions\" : [\n {\n \"description\" : \"9130 Beveren, Belgium\",\n \"id\" : \"96df4cd9b49e7ba4172485e91a4d268223886695\",\n \"matched_substrings\" : [\n {\n \"length\" : 4,\n \"offset\" : 0\n },\n {\n \"length\"

我收到的变量
content
中的json字符串如下:

"{\n \"predictions\" : [\n {\n \"description\" : \"9130 Beveren, Belgium\",\n \"id\" : \"96df4cd9b49e7ba4172485e91a4d268223886695\",\n \"matched_substrings\" : [\n {\n \"length\" : 4,\n \"offset\" : 0\n },\n 
{\n \"length\" : 7,\n \"offset\" : 14\n }\n ],\n \"place_id\" : \"ChIJk9NyZm8IxEcRDuOa4IbwK9Q\",\n \"reference\" : \"ChIJk9NyZm8IxEcRDuOa4IbwK9Q\",\n \"structured_formatting\" : {\n \"main_text\" : \"9130\",
\n \"main_text_matched_substrings\" : [\n {\n \"length\" : 4,\n \"offset\" : 0\n }\n ],\n \"secondary_text\" : \"Beveren, Belgium\",\n \"secondary_text_matched_substrings\" : [\n {\n 
\"length\" : 7,\n \"offset\" : 9\n }\n ]\n },\n \"terms\" : [\n {\n               \"offset\" : 0,\n \"value\" : \"9130\"\n },\n {\n \"offset\" : 5,\n \"value\" : \"Beveren\"\n },\n {\n \"offset\" : 14,\n \"value\" : \"Belgium\"\n }\n         ],\n \"types\" : [ \"postal_code\", \"geocode\" ]\n }\n ],\n \"status\" : \"OK\"\n}\n"
相同的JSON格式可提高可读性:

{
    predictions : [
        {
            "description" : "9130 Beveren, Belgium",
            "id" : "96df4cd9b49e7ba4172485e91a4d268223886695",
            "matched_substrings" : [
                {
                    "length" : 4,
                    "offset" : 0
                },
                {
                "length" : 7,
                "offset" : 14
                }
            ],
            "place_id" : "ChIJk9NyZm8IxEcRDuOa4IbwK9Q",
            "reference" : "ChIJk9NyZm8IxEcRDuOa4IbwK9Q",
            "structured_formatting" : {
                "main_text" : "9130",
                "main_text_matched_substrings" : [
                    {
                        "length" : 4,
                        "offset" : 0
                    }
                ],
                "secondary_text" : "Beveren, Belgium",
                "secondary_text_matched_substrings" : [
                    {
                        "length" : 7,
                        "offset" : 9
                    }
                ]
            },
            "terms" : [
                {
                    "offset" : 0,
                    "value" : "9130"
                },
                {
                    "offset" : 5,
                    "value" : "Beveren"
                },
                {
                    "offset" : 14,
                    "value" : "Belgium"
                }
            ],
            "types" : [ "postal_code", "geocode" ]
        }
    ],
    "status" : "OK"
}
我需要检索
place\u id
的值,但我不知道如何执行。
我所期望的结果是
ChIJk9NyZm8IxEcRDuOa4IbwK9Q

我试过这个

dynamic data = JObject.Parse(content);
string result = data["place_id"].ToString();  
还有这个

string result = data["predictions.place_id"].ToString();
但他们都一无所获

如果我做data[“predictions”],它会返回有8行的数据,我可以看到变量'place_id`及其值,但我不知道如何提取它


检索此值的正确且最快的方法是什么?

我使用json格式化程序格式化json:

{  
   "predictions":[  
      {  
         "description":"9130 Beveren, Belgium",
         "id":"96df4cd9b49e7ba4172485e91a4d268223886695",
         "matched_substrings":[  
            {  
               "length":4,
               "offset":0
            },
            {  
               "length":7,
               "offset":14
            }
         ],
         "place_id":"ChIJk9NyZm8IxEcRDuOa4IbwK9Q",
         "reference":"ChIJk9NyZm8IxEcRDuOa4IbwK9Q",
         "structured_formatting":{  
            "main_text":"9130",
            "main_text_matched_substrings":[  
               {  
                  "length":4,
                  "offset":0
               }
            ],
            "secondary_text":"Beveren, Belgium",
            "secondary_text_matched_substrings":[  
               {  
                  "length":7,
                  "offset":9
               }
            ]
         },
         "terms":[  
            {  
               "offset":0,
               "value":"9130"
            },
            {  
               "offset":5,
               "value":"Beveren"
            },
            {  
               "offset":14,
               "value":"Belgium"
            }
         ],
         "types":[  
            "postal_code",
            "geocode"
         ]
      }
   ],
   "status":"OK"
}
预测
实际上是一个数组。您需要指定
prediction
的哪个元素,然后才能说您想要
place\u id
。在本例中,只有一个元素,因此您可以执行以下操作:

var result = data["predictions"][0]["place_id"];

但在其他情况下,您可能会得到多个预测。您需要决定要将位置id转换为哪个预测。

我建议您将其转换为类格式,以获得更好的方法和更高的可读性和可维护性。下面是JSON数据的示例类

public class MatchedSubstring
{
    public int length { get; set; }
    public int offset { get; set; }
}

public class MainTextMatchedSubstring
{
    public int length { get; set; }
    public int offset { get; set; }
}

public class SecondaryTextMatchedSubstring
{
    public int length { get; set; }
    public int offset { get; set; }
}

public class StructuredFormatting
{
    public string main_text { get; set; }
    public IList<MainTextMatchedSubstring> main_text_matched_substrings { get; set; }
    public string secondary_text { get; set; }
    public IList<SecondaryTextMatchedSubstring> secondary_text_matched_substrings { get; set; }
}

public class Term
{
    public int offset { get; set; }
    public string value { get; set; }
}

public class Prediction
{
    public string description { get; set; }
    public string id { get; set; }
    public IList<MatchedSubstring> matched_substrings { get; set; }
    public string place_id { get; set; }
    public string reference { get; set; }
    public StructuredFormatting structured_formatting { get; set; }
    public IList<Term> terms { get; set; }
    public IList<string> types { get; set; }
}

public class Prediction
{
    public IList<Prediction> predictions { get; set; }
    public string status { get; set; }
}


Prediction predictionJSON = JsonConvert.DeserializeObject<Prediction>(jsonString);

string PlaceID=predictionJSON.predictions[0].place_id;
公共类匹配子字符串
{
公共整数长度{get;set;}
公共整数偏移量{get;set;}
}
公共类MainTextMatchedSubstring
{
公共整数长度{get;set;}
公共整数偏移量{get;set;}
}
公共类SecondaryTextMatchedSubstring
{
公共整数长度{get;set;}
公共整数偏移量{get;set;}
}
公共类结构格式
{
公共字符串main_text{get;set;}
公共IList main_text_matched_子字符串{get;set;}
公共字符串次要_文本{get;set;}
public IList secondary_text_matched_子字符串{get;set;}
}
公共类术语
{
公共整数偏移量{get;set;}
公共字符串值{get;set;}
}
公共类预测
{
公共字符串说明{get;set;}
公共字符串id{get;set;}
公共IList匹配的_子字符串{get;set;}
公共字符串place_id{get;set;}
公共字符串引用{get;set;}
公共结构格式化结构化_格式化{get;set;}
公共IList术语{get;set;}
公共IList类型{get;set;}
}
公共类预测
{
公共IList预测{get;set;}
公共字符串状态{get;set;}
}
Prediction predictionJSON=JsonConvert.DeserializeObject(jsonString);
字符串PlaceID=predictionJSON.predictions[0].place\u id;
使用json

{
    predictions : [
        {
            "description" : "9130 Beveren, Belgium",
            "id" : "96df4cd9b49e7ba4172485e91a4d268223886695",
            "matched_substrings" : [
                {
                    "length" : 4,
                    "offset" : 0
                },
                {
                "length" : 7,
                "offset" : 14
                }
            ],
            "place_id" : "ChIJk9NyZm8IxEcRDuOa4IbwK9Q",
            "reference" : "ChIJk9NyZm8IxEcRDuOa4IbwK9Q",
            "structured_formatting" : {
                "main_text" : "9130",
                "main_text_matched_substrings" : [
                    {
                        "length" : 4,
                        "offset" : 0
                    }
                ],
                "secondary_text" : "Beveren, Belgium",
                "secondary_text_matched_substrings" : [
                    {
                        "length" : 7,
                        "offset" : 9
                    }
                ]
            },
            "terms" : [
                {
                    "offset" : 0,
                    "value" : "9130"
                },
                {
                    "offset" : 5,
                    "value" : "Beveren"
                },
                {
                    "offset" : 14,
                    "value" : "Belgium"
                }
            ],
            "types" : [ "postal_code", "geocode" ]
        }
    ],
    "status" : "OK"
}
您可以使用JsonConvert.DeserializeObject静态方法将json反序列化为动态对象,然后访问其属性成员,但是使用此方法是有风险的,因为如果json发生更改,代码将中断

 dynamic obj = JsonConvert.DeserializeObject(json);
 var palceId = obj.predictions[0].place_id;  //ChIJk9NyZm8IxEcRDuOa4IbwK9Q

字符串中的所有反斜杠-它们实际上是在字符串中,还是这正是您在调试器中看到的?如果你能发布真实的文本,帮助你会更容易。你的
预测
是一个数组,那么你的预测有多少在这个数组中,你想检索哪些预测
位置id
?意味着如果有5个预测,那么你想检索第一个、第二个或第三个或所有预测?谢谢Georg,我刚刚这么做了我自己谢谢,实际上我只希望有一个,因为这是一个谷歌api,可以从一个国家的特定邮政编码中获取地名id。