I have spent a lot of time to find a solution for my problem.
In this example, I have 2 records in SetNavRecords array. The first one is \"Artikelnummer\" :
var tmpResult = JObject.Parse(File.ReadAllText(FileName));
var resultObject = tmpResult["SetNavRecords"].Values("OfflineVerkaufspreis").Values<JObject>()
.Where(n => n["Location_Code"].Value<string>() == "MH");
This code will navigate to OfflineVerkaufspreis.Values
and then filter them.
But (I guess) you want to select the location that matches your Where
clause and then also selects the parent details.
You can use Select
to select all the information you are really interested in.
var resultObject = tmpResult["SetNavRecords"].Values("OfflineVerkaufspreis").Values<JObject>()
.Where(n => n["Location_Code"].Value<string>() == "MH")
.Select(n => new { Location = n, Context = n.Parent }).ToArray();
Of course you can select just the information you really need instead of the entire Parent.
To make this code more readable, I would suggest to create some classes that match the JSon input so that you can map the JSon to this graph of objects. It will make your Linq alot easier to write, read and understand.
Update:
In the comments is suggested to use: .Where(n => n["OfflineVerkaufspreis"]["Location_Code"] ...
. The problem with this approach is that in the end you don't know which of the OfflineVerkaufspreis actually matched your where clause...
I would have created classes by the name SetNavRecords and OfflineVerkaufspreis. Then I would have used JavaScriptSerializer from namespace System.Web.Script.Serialization.JavaScriptSerializer to deserialize it.
Code goes like this-
JavaScriptSerializer.Deserialize(String, Type);
Then I can operate it like simple generic collection eg. list.
Hope this will help you little bit.
This feels like a job that could be made a little easier by switching to serialization of the json into objects. To deserialize the json into an object you could use:
RootObject obj = JsonConvert.DeserializeObject<RootObject>(jsonString);
likewise, you can turn your object back into json using:
string jsonString = JsonConvert.SerializeObject(RootObject);
The structure of your object based on the json you provided in the question is such:
public class OfflineVerkaufsprei
{
public bool Allow_Line_Discount { get; set; }
public string Date { get; set; }
public string Item_No { get; set; }
public string Location_Code { get; set; }
public double Unit_Price { get; set; }
}
public class SetNavRecord
{
public string Artikelbeschreibung { get; set; }
public string Artikelbeschreibung2 { get; set; }
public string Artikelnummer { get; set; }
public string Artikelrabattgruppe { get; set; }
public bool Gutschein { get; set; }
public string MwStProduktgruppe { get; set; }
public List<OfflineVerkaufsprei> OfflineVerkaufspreis { get; set; }
}
public class RootObject
{
public List<SetNavRecord> SetNavRecords { get; set; }
}
you can then iterate easily over your objects by saying:
for each(SetNavRecord i in obj.SetNavRecords)
{
// do something to the record
}