如何将给定的Json字符串反序列化为已定义的类

时间:2017-10-19 12:05:12

标签: c# json xamarin json.net

下面是我的Json字符串

Json String

{
  "RestResponse": {
    "messages": [
      "Country found matching code [IN]."
    ],
    "result": {
      "name": "India",
      "alpha2_code": "IN",
      "alpha3_code": "IND"
    }
  }
}

我在Xamarin中创建了这些类,但是没有将Json解析为对象,请指导。

public class Country
{
    [JsonProperty(PropertyName = "RestResponse")]
    public List<myRestResponse> RestResponse { get; set; }
}

public class myRestResponse
{
    [JsonProperty(PropertyName = "messages")]
    public List<string> messages { get; set; }
    [JsonProperty(PropertyName = "result")]
    public List<Result> result { get; set; }
}

public class Result
{
    [JsonProperty(PropertyName = "name")]
    public string name { get; set; }
    [JsonProperty(PropertyName = "alpha2_code")]
    public string alpha2_code { get; set; }
    [JsonProperty(PropertyName = "alpha3_code")]
    public string alpha3_code { get; set; }
}

我正在使用下面的代码进行反序列化

var content = await response.Content.ReadAsStringAsync();
Country  country = JsonConvert.DeserializeObject<Country>(content);

3 个答案:

答案 0 :(得分:2)

使用http://json2csharp.com/等工具有助于定义您的课程。

这给出了

的结果
public class Result
{
    public string name { get; set; }
    public string alpha2_code { get; set; }
    public string alpha3_code { get; set; }
}

public class RestResponse
{
    public List<string> messages { get; set; }
    public Result result { get; set; }
}

public class Country
{
    public RestResponse RestResponse { get; set; }
}

因此,您可以看到您的Country类(Root对象)不应该有列表。

并且RestResponse应该只包含一个Result对象,而不是列表。

答案 1 :(得分:0)

根据您的类结构,您的JSON格式不正确。 JSON有两个问题。根据您的类结构,您正在尝试DeSerialize,property'RestResponse'是一个数组,但在您的JSON中它不是。另一个是属性'result',它又是一个数组,但在你的JSON中它不是。根据您的JSON格式更新您的类结构,或者请尝试以下JSON,

{
  "RestResponse": [
    {
      "messages": [ "Country found matching code [IN]." ],
      "result": [
        {
          "name": "India",
          "alpha2_code": "IN",
          "alpha3_code": "IND"
        }
      ]
    }
  ]
}

如果您想更新课程结构,请复制以下课程,

public class Result
{
public string name { get; set; }
public string alpha2_code { get; set; }
public string alpha3_code { get; set; }
}

public class RestResponse
{
public List<string> messages { get; set; }
public Result result { get; set; }
}

public class RootObject
{
public RestResponse RestResponse { get; set; }
}

答案 2 :(得分:0)

您的班级定义与回复数据不匹配。您可以使用一些在线工具轻松创建类定义。如果您使用的是Visual Studio,则可以使用编辑菜单中的选择性粘贴选项。请记住,在进行粘贴之前,您必须先复制响应字符串。

enter image description here