我有一个微服务架构,用于使用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"}]
答案 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。