无法解析Json子对象

时间:2014-11-26 21:48:35

标签: asp.net asp.net-mvc json asp.net-mvc-5 json.net

我正在使用JObject来解析<{p}下面的Json个对象

string Jstring = @"{
  "PolicyId" :"xxxxxx",
  "PolicyHolder" :{"title":"Mr", "FirstName":"test", "LastName":"testLast"}
}";

我可以通过以下代码获取PolicyId

Jobject jobj = Jobject.parse(Jstring);
string PolicyId = jobj.value<string>("PolicyId");

但是,我总是使用以下代码获取null

string Holder = jobj.value<string>("PolicyHolder");

我调试了以下代码:

jobj.Properties() 

我可以在列表中找到PolicyHolder。我也尝试过以下代码,值始终为null

JProperty jproperty = jobj.Properties().SingleOrDefault(x => x.Name == "PolicyHolder");

谁知道会发生什么?

2 个答案:

答案 0 :(得分:0)

string Holder = jobj.value<string>("PolicyHolder");

以上行失败,因为PolicyHolder不是string。您正试图将其投射到string。它是object。您必须使用PolicyHolder的属性创建一个类,并将其用作类型而不是string

答案 1 :(得分:0)

这是工作的dotNetFiddle:https://dotnetfiddle.net/xOOl5m

控制台输出:

parse json sub object

以下是我最终宣布和使用的课程。

public class PolicyHolder
{
    public string title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Policy
{
    public string PolicyId { get; set; }
    public PolicyHolder PolicyHolder { get; set; }
}

Sam提到的一样,PolicyHolderObject而不是字符串。

这是完整的代码清单(以便答案是自包含的)。

using System;               
using System.Linq;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;

public class Program
{
    // Solution to SO Question: https://stackoverflow.com/q/27159478/325521
    // This Answer: https://stackoverflow.com/a/
    // Author: Shiva Manjunath
    // SO Profile: https://stackoverflow.com/users/325521/shiva
    public static void Main()
    {       
        string Jstring = @"{
        ""PolicyId"" :""xxxxxx"",
        ""PolicyHolder"" :{""title"":""Mr"", ""FirstName"":""test"", ""LastName"":""testLast""}
        }";

        JObject jObject = JObject.Parse(Jstring);
        JProperty jProperty = jObject.Properties().SingleOrDefault(x => x.Name == "PolicyHolder");

        Console.WriteLine("Printing Policy Holder Details....");
        Console.WriteLine(jProperty.Value);
    }
}

public class PolicyHolder
{
    public string title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Policy
{
    public string PolicyId { get; set; }
    public PolicyHolder PolicyHolder { get; set; }
}