如何在 C# 中使用动态嵌套 JSON 文档
How to work with dynamic nested JSON document in C#
我有一个嵌套的动态 JSON 模板文档,我需要对其进行反序列化并向其插入值以生成一个 JSON 内容,其中包含值。
我有一个用于非嵌套 JSON 的工作逻辑,但我不确定如何制作与嵌套文档一起使用的逻辑(递归或其他更简单的方法,如果有的话)。
样本JSON模板
{
"LoanDate": [
"Test"
],
"borrowerdetail": [
{
"borrowid": [
"Test"
],
"Name": [
"Test"
],
"Type": [
"Test"
],
"Status": [
"Test"
]
}
],
"loans": [
{
"bibdetails": [
{
"id": [
"Test"
],
"title": [
"Test"
],
"author": [
"Test",
"Test"
]
}
],
"Collection": [
"Test"
],
"ItemType": [
"Test"
],
"ItemNo": [
"Test"
]
}
],
"LoansItemBib": [
"Test"
],
"LoansItem": [
"Test"
]
}
当前逻辑
JavaScriptSerializer _objSolrDeserialized = new JavaScriptSerializer();
SolrResultTemp = "{";
dynamic SolrTempObject = _objSolrDeserialized.Deserialize<dynamic>(SolrResultTemp);
string Serialized = _objSolrDeserialized.Serialize(SolrTempObject);
int _iParentCount = 0;
foreach (var ObjSolr in SolrTempObject)
{
var Type = ObjSolr.Value.GetType();
if (Type.Name == "String")
{
string Value = ObjSolr.Value.Replace("$", "").Replace("^", "");
List<string> ResString = ReturnConciseValEntry(Value, null, db2, FullTextPath, null, null);
if (ResString.Count > 0)
{
foreach (var Res in ResString)
{
if (_iParentCount > 0)
SolrResultTemp = SolrResultTemp + ",";
SolrResultTemp = SolrResultTemp + "\"" + ObjSolr.Key + "\": \"" + Res + "\"";
_iParentCount += 1;
}
}
}
if (Type.Name == "Object[]")
{
string Key = ObjSolr.Key;
List<string> _lstValue = new List<string>();
foreach (var x in ObjSolr.Value)
{
string Value = x.Replace("$", "").Replace("^", "");
List<string> ResString = ReturnConciseValEntry(Value, null, db2, FullTextPath, null, null);
if (ResString.Count > 0)
_lstValue.AddRange(ResString);
}
if (_lstValue.Count > 0)
{
if (_iParentCount > 0)
SolrResultTemp = SolrResultTemp + ",";
SolrResultTemp = SolrResultTemp + "\"" + ObjSolr.Key + "\" : [ \"" + string.Join("\" , \"", _lstValue) + "\" ]";
_iParentCount += 1;
}
}
}
SolrResultTemp = SolrResultTemp + "}";
我不得不使用递归方法来完成工作。这是工作代码。
代码
public IDictionary<string, object> ProcessJson(IDictionary<string, object> inputDic, LoansLogData loandata, string itemno, string parentKey = "", string childKey = "", int cnt = 1)
{
dynamic flexible = new ExpandoObject();
IDictionary<string, object> ResultDic = (IDictionary<string, object>)flexible;
try
{
foreach (KeyValuePair<string, object> entry in inputDic)
{
List<string> ElementCollection = new List<string>();
List<string> _lstValue = new List<string>();
if (entry.Value is System.Collections.ICollection)
{
var countProp = entry.Value.GetType().GetProperty("Count");
var count = (int)countProp.GetValue(entry.Value, null);
int loopcount = 0;
foreach (var item in (System.Collections.ICollection)entry.Value)
{
if (item is Dictionary<string, object>)
{
if (entry.Key != null && entry.Key.Trim().StartsWith("@"))
{
parentKey = entry.Key.Trim();
parentKey = parentKey.Substring(0, parentKey.IndexOf(' '));
childKey = entry.Key.Trim().Replace(parentKey, "");
childKey = childKey.Trim();
}
if (parentKey == "@Loans")
{
List<IDictionary<string, object>> catList = new List<IDictionary<string, object>>();
foreach (var singleBibItem in loandata.ItemNo)
{
catList.Add(ProcessJson((Dictionary<string, object>)item, loandata, singleBibItem, parentKey, childKey, cnt));
cnt++;
}
ResultDic.Add(childKey, catList);
}
else
{
List<IDictionary<string, object>> BorrowList = new List<IDictionary<string, object>>();
BorrowList.Add(ProcessJson((Dictionary<string, object>)item, loandata, itemno, parentKey, childKey));
ResultDic.Add(childKey, BorrowList);
}
}
else
{
List<string> ResString = ReturnLoanConciseValEntry(parentKey, (String)item, itemno, loandata, cnt);
if (ResString.Count > 0)
{
_lstValue.AddRange(ResString);
}
if (_lstValue.Count > 0)
{
if (((String)item == "LoansItemBib" || (String)item == "LoansItemNo"))
_lstValue = _lstValue.Distinct().ToList();
loopcount += 1;
if (loopcount == count)
ResultDic.Add(entry.Key, _lstValue);
}
}
}
}
}
return ResultDic;
}
catch (Exception ex)
{
return ResultDic;
}
}
我有一个嵌套的动态 JSON 模板文档,我需要对其进行反序列化并向其插入值以生成一个 JSON 内容,其中包含值。 我有一个用于非嵌套 JSON 的工作逻辑,但我不确定如何制作与嵌套文档一起使用的逻辑(递归或其他更简单的方法,如果有的话)。
样本JSON模板
{
"LoanDate": [
"Test"
],
"borrowerdetail": [
{
"borrowid": [
"Test"
],
"Name": [
"Test"
],
"Type": [
"Test"
],
"Status": [
"Test"
]
}
],
"loans": [
{
"bibdetails": [
{
"id": [
"Test"
],
"title": [
"Test"
],
"author": [
"Test",
"Test"
]
}
],
"Collection": [
"Test"
],
"ItemType": [
"Test"
],
"ItemNo": [
"Test"
]
}
],
"LoansItemBib": [
"Test"
],
"LoansItem": [
"Test"
]
}
当前逻辑
JavaScriptSerializer _objSolrDeserialized = new JavaScriptSerializer();
SolrResultTemp = "{";
dynamic SolrTempObject = _objSolrDeserialized.Deserialize<dynamic>(SolrResultTemp);
string Serialized = _objSolrDeserialized.Serialize(SolrTempObject);
int _iParentCount = 0;
foreach (var ObjSolr in SolrTempObject)
{
var Type = ObjSolr.Value.GetType();
if (Type.Name == "String")
{
string Value = ObjSolr.Value.Replace("$", "").Replace("^", "");
List<string> ResString = ReturnConciseValEntry(Value, null, db2, FullTextPath, null, null);
if (ResString.Count > 0)
{
foreach (var Res in ResString)
{
if (_iParentCount > 0)
SolrResultTemp = SolrResultTemp + ",";
SolrResultTemp = SolrResultTemp + "\"" + ObjSolr.Key + "\": \"" + Res + "\"";
_iParentCount += 1;
}
}
}
if (Type.Name == "Object[]")
{
string Key = ObjSolr.Key;
List<string> _lstValue = new List<string>();
foreach (var x in ObjSolr.Value)
{
string Value = x.Replace("$", "").Replace("^", "");
List<string> ResString = ReturnConciseValEntry(Value, null, db2, FullTextPath, null, null);
if (ResString.Count > 0)
_lstValue.AddRange(ResString);
}
if (_lstValue.Count > 0)
{
if (_iParentCount > 0)
SolrResultTemp = SolrResultTemp + ",";
SolrResultTemp = SolrResultTemp + "\"" + ObjSolr.Key + "\" : [ \"" + string.Join("\" , \"", _lstValue) + "\" ]";
_iParentCount += 1;
}
}
}
SolrResultTemp = SolrResultTemp + "}";
我不得不使用递归方法来完成工作。这是工作代码。
代码
public IDictionary<string, object> ProcessJson(IDictionary<string, object> inputDic, LoansLogData loandata, string itemno, string parentKey = "", string childKey = "", int cnt = 1)
{
dynamic flexible = new ExpandoObject();
IDictionary<string, object> ResultDic = (IDictionary<string, object>)flexible;
try
{
foreach (KeyValuePair<string, object> entry in inputDic)
{
List<string> ElementCollection = new List<string>();
List<string> _lstValue = new List<string>();
if (entry.Value is System.Collections.ICollection)
{
var countProp = entry.Value.GetType().GetProperty("Count");
var count = (int)countProp.GetValue(entry.Value, null);
int loopcount = 0;
foreach (var item in (System.Collections.ICollection)entry.Value)
{
if (item is Dictionary<string, object>)
{
if (entry.Key != null && entry.Key.Trim().StartsWith("@"))
{
parentKey = entry.Key.Trim();
parentKey = parentKey.Substring(0, parentKey.IndexOf(' '));
childKey = entry.Key.Trim().Replace(parentKey, "");
childKey = childKey.Trim();
}
if (parentKey == "@Loans")
{
List<IDictionary<string, object>> catList = new List<IDictionary<string, object>>();
foreach (var singleBibItem in loandata.ItemNo)
{
catList.Add(ProcessJson((Dictionary<string, object>)item, loandata, singleBibItem, parentKey, childKey, cnt));
cnt++;
}
ResultDic.Add(childKey, catList);
}
else
{
List<IDictionary<string, object>> BorrowList = new List<IDictionary<string, object>>();
BorrowList.Add(ProcessJson((Dictionary<string, object>)item, loandata, itemno, parentKey, childKey));
ResultDic.Add(childKey, BorrowList);
}
}
else
{
List<string> ResString = ReturnLoanConciseValEntry(parentKey, (String)item, itemno, loandata, cnt);
if (ResString.Count > 0)
{
_lstValue.AddRange(ResString);
}
if (_lstValue.Count > 0)
{
if (((String)item == "LoansItemBib" || (String)item == "LoansItemNo"))
_lstValue = _lstValue.Distinct().ToList();
loopcount += 1;
if (loopcount == count)
ResultDic.Add(entry.Key, _lstValue);
}
}
}
}
}
return ResultDic;
}
catch (Exception ex)
{
return ResultDic;
}
}