JSON.NET不会转换回JObject

时间:2016-02-05 12:49:49

标签: c# json json.net

我有一个微服务架构,用于使用Angularjs,Web Api和DocumentDb开发的解决方案。我有一个简单的控制器,它接受一个json文件并将其作为一个JObject返回到整个线路......就像这样......

using (StreamReader streamReader = new StreamReader(HostingEnvironment.MapPath(@"~/Json/" + path + ".json"), Encoding.UTF8))
            {
                dtsContent = JObject.Load(new JsonTextReader(streamReader));
            }
            return new IsoncOkResult<JObject>(dtsContent, this) ;

IsoncOkResult只是我对IHttpActionResult的实现 以上工作没有错误.... 但是当我在呼叫服务上执行此代码时...

var response = (HttpWebResponse)httpWebRequest.GetResponse();
var sr = new StreamReader(response.GetResponseStream());
var dtsLookup = JObject.Load(new JsonTextReader(sr));

我得到了可怕的JsonReader currentitem不是对象错误...

我尝试过JToken,JArray ....没有工作......我需要能够在c#中访问返回的对象

dtsLookup["name"] 

或者其他......

原始JSON是......

[ {
"name": "1|Identifiers|ShipName",
"flag": "1|Flag",
"ircs": "1|Identifiers|Ircs",
"flag_reg_number": "1|Identifiers|FlagRegNo",
"mmsi": "1|Identifiers|Mmis",
"port_of_registry": "1|Port",
"date_of_flag_registerd": "1|FirstRegDate",
"parallel_registry": "1|HistoricalData|ParallelReg",
"previous_de_registered_date": "1|HistoricalData|PrevDeRegDate",
"ffa_vid": "1|Identifiers|SecondaryId"}]

1 个答案:

答案 0 :(得分:2)

您的JSON由一个包含单个对象的数组组成:

[{"name1" : "value1", ..., "nameN" : "valueN"}]

括号表示一个数组,嵌套的括号表示一个对象。

如果您不确定您的JSON对象是否将嵌套在数组中,并且只想获取JSON中出现的第一个对象,您可以这样做:

        var dtsRoot = (JContainer)JToken.Load(new JsonTextReader(sr)); // JContainer is the base class for JArray and JObject
        var dtsLookup = dtsRoot.DescendantsAndSelf().OfType<JObject>().FirstOrDefault();
        var name = (string)dtsLookup["name"];

或者,您可以使用SelectToken..递归下降通配符来查找出现在JSON文档中任何位置的给定名称的第一个属性的值:

        var dtsRoot = JToken.Load(new JsonTextReader(sr));
        var name = (string)dtsRoot.SelectToken("..name");

SelectToken支持JSONPath query syntax