c# - 用数组读取 JSON 文件
问题描述
我目前正在使用 C# 进行 JSON 字符串提取。我的 JSON 字符串由一个带有重复键的数组组成。不确定我是否描述正确,因为我是新手。
这是我的 JSON 字符串
{"Index":
{ "LibraryName":"JGKing"
, "FormName":"AccountsPayable"
, "User":null
, "FilingPriority":null
, "FileDescription":null
, "Fields":
{"Field":
[
{ "Name":"invItemID"
, "Value":"6276"
}
,{ "Name":"invEntityCode"
, "Value":"16"
}
,{ "Name":"invVendorCode"
, "Value":"MIRUB01"
}
,{ "Name":"invNumber"
, "Value":"PWD5"
}
,{ "Name":"invDate"
, "Value":"2017-08-21"
}
,{ "Name":"invStatus"
, "Value":""
}
,{ "Name":"invCurrencyCode"
, "Value":"AU"
}
,{ "Name":"invCurrencyRate"
, "Value":"1"
}
,{ "Name":"invTax"
, "Value":"454.3"
}
, {"Name":"invTotal"
, "Value":"4997.27"
}
, {"Name":"invReceivedDate"
, "Value":"2017-09-06"
}
,{ "Name":"InvoiceLine1"
, "Value":"{\r\n \"invLineNumber\": \"1\",\r\n \"invPONumber\": \"\",\r\n \"invPOLineNo\": \"1\",\r\n \"invPOJobID\": \"\",\r\n \"invCostCode\": \"\",\r\n \"invCategory\": \"\",\r\n \"invGLCode\": \"61-01-49-6862.517\",\r\n \"invDescription\": \"\",\r\n \"invEntryType\": \"\",\r\n \"invAmount\": \"4542.97\",\r\n \"invTaxAmount\": \"454.3\",\r\n \"invTaxCode\": \"GST\",\r\n \"invAmountIncTax\": \"4997.27\"\r\n}"}]}}}
我需要提取数组内的 invItemID 键的值。我试图从一个类中序列化我的 json 字符串,但它在 List<> 中返回 null
这是我的代码
public void CFExport(string jsonFile)
{
string ItemIDField;
string ItemIDValue;
using (StreamReader r = new StreamReader(jsonFile))
{
JsonSerializer s = new JsonSerializer();
var Idx = (JSONMain)s.Deserialize(r, typeof(JSONMain));
var flds = (Fields)s.Deserialize(r, typeof(Fields));
if (flds != null)
{
foreach (var _field in flds.Field)
{
ItemIDField = _field.Name;
ItemIDValue = _field.Value;
}
}
}
}
public class JSONMain
{
public Index Index { get; set; }
}
public class Index
{
public string LibraryName { get; set; }
public string FormName { get; set; }
public string User { get; set; }
public string FilingPriority { get; set; }
public string FileDescription { get; set; }
}
public class Fields
{
public List<Field> Field { get; set; }
}
public class Field
{
public string Name { get; set; }
public string Value { get; set; }
}
我希望你能帮助我。
提前致谢
解决方案
尝试使用您的类反映 JSON 文件,如下所示:
public class Index
{
public string LibraryName { get; set; }
public string FormName { get; set; }
public string User { get; set; }
public string FilingPriority { get; set; }
public string FileDescription { get; set; }
public Fields Fields { get; set; } //this line makes the difference
}
如果您现在反序列化,则应自动填充字段。我还建议您使用它,JsonConvert.Deserialze<>()
因为它更容易一些(请参阅文档)并且您是该主题的新手。
获取 的值invItemID
可能如下所示:
public void CFExport(string jsonFile)
{
string ItemIDField = "invItemID";
string ItemIDValue;
using (StreamReader r = new StreamReader(jsonFile))
{
var Idx = JsonConvert.DeserializeObject<JSONMain>(r);
foreach(var field in Idx.Index.Fields.Field)
{
if(field.Name == ItemIDField)
{
ItemIDValue = field.Value;
}
}
}
}
哇哦。我在 Stackoverflow 上的第一个答案!我希望这可以帮助你。
推荐阅读
- r - 从 SAS 过渡到 R——如何在 R 中有效地重复相同的任务
- android - PlayerNotificationManager 未显示在 exoplayer、android 上播放视频的通知?
- sql - 添加与其他列相关的检查约束
- xcode - XCode 11:后台区域监控不起作用
- sharepoint - 禁用列表/文档库上的 PowerApps 按钮
- c++ - 如何使特征接受参数包?
- c++ - 使用开放寻址在哈希表中插入节点[优化逻辑]
- node.js - 如何在进行 ember 生产构建时隐藏 .hbs 和 .js 中的部分
- python - 如果我们有概率密度函数数据作为 x 和 y,则计算百分位数
- gcloud - gcloud pubsub 发布消息问题