解决 如何不使用索引从JSON中的元素获取值?

WeyardWiz

会员
已加入
2020年10月23日
留言内容
23
编程经验
3-5
我有以下代码提取json元素值并将其输出到csv:

C#:
public static void Json_to_Csv(string jsonInputFile, string csvFile)
{
    using (var p = new ChoJSONReader(jsonInputFile).WithJSONPath("$..readResults")) // "readResults": [
    {
        using (var w = new ChoCSVWriter(csvFile).WithFirstLineHeader())
        {
            w.Write(p
                .Select(r1 =>
                {
                    var lines = (dynamic[])r1.lines;
                    return new
                    {
                        FileName = jsonInputFile,
                        Page = r1.page,
                        PracticeName = lines[2].text,
                        OwnerFullName = lines[4].text,
                        OwnerEmail = lines[6].text,
                    };
                }
        }
    }
}

csv输出:

文件名,页面,实践名称,所有者全名,所有者电子邮件
file1.json,1,Some Practice Name,Bob Lee,鲍勃@ someemail.com

当前在每个项目上没有其他上下文信息可以引用它们,因此唯一的方法是通过索引,例如线[2]

现在可以使用,但是我可能还有其他具有额外字段的JSON文件,因此提取的值将是错误的。

为了解决这种情况, 我如何在上下文中拉取值而不是对行进行索引?

我试过了
C#:
PracticeName = lines["Practice Name"].text

但我明白了 无法将类型字符串隐式转换为int 错误


file1.json示例:

JSON:
{
  "status": "succeeded",
  "createdDateTime": "2020-10-22T19:35:35Z",
  "lastUpdatedDateTime": "2020-10-22T19:35:36Z",
  "analyzeResult": {
    "version": "3.0.0",
    "readResults": [
      {
        "page": 1,
        "angle": 0,
        "width": 8.5,
        "height": 11,
        "unit": "inch",
        "lines": [        
          {
            "boundingBox": [
              0.5016,
              1.9141,
              2.5726,
              1.9141,
              2.5726,
              2.0741,
              0.5016,
              2.0741
            ],          
           "text": "Account Information",
            "words": [
              {
                "boundingBox": [
                  0.5016,
                  1.9345,
                  1.3399,
                  1.9345,
                  1.3399,
                  2.0741,
                  0.5016,
                  2.0741
                ],
                "text": "Account",
                "confidence": 1
              },
              {
                "boundingBox": [
                  1.3974,
                  1.9141,
                  2.5726,
                  1.9141,
                  2.5726,
                  2.0741,
                  1.3974,
                  2.0741
                ],
                "text": "Information",
                "confidence": 1
              }
            ]
          },
          {
            "boundingBox": [
              1.7716,
              2.4855,
              2.8793,
              2.4855,
              2.8793,
              2.6051,
              1.7716,
              2.6051
            ],
            "text": "Practice Name",
            "words": [
              {
                "boundingBox": [
                  1.7716,
                  2.4855,
                  2.3803,
                  2.4855,
                  2.3803,
                  2.6051,
                  1.7716,
                  2.6051
                ],
                "text": "Practice",
                "confidence": 1
              },
              {
                "boundingBox": [
                  2.4362,
                  2.4948,
                  2.8793,
                  2.4948,
                  2.8793,
                  2.6051,
                  2.4362,
                  2.6051
                ],
                "text": "Name",
                "confidence": 1
              }
            ]
          },
          {
            "boundingBox": [
              2.9993,
              2.5257,
              4.7148,
              2.5257,
              4.7148,
              2.714,
              2.9993,
              2.714
            ],
            "text": "Some Practice Name",
            "words": [
              {
                "boundingBox": [
                  3.0072,
                  2.5385,
                  3.6546,
                  2.5284,
                  3.6516,
                  2.7131,
                  3.0105,
                  2.712
                ],
                "text": "Some",
                "confidence": 0.984
              },
              {
                "boundingBox": [
                  3.6887,
                  2.5281,
                  4.2112,
                  2.5262,
                  4.2028,
                  2.7159,
                  3.6854,
                  2.7132
                ],
                "text": "Parctice",
                "confidence": 0.986
              },
              {
                "boundingBox": [
                  4.2453,
                  2.5263,
                  4.7223,
                  2.5297,
                  4.7091,
                  2.72,
                  4.2366,
                  2.7161
                ],
                "text": "Name",
                "confidence": 0.986
              }
            ]
          },
          {
            "boundingBox": [
              1.6116,
              2.9999,
              2.8816,
              2.9999,
              2.8816,
              3.1158,
              1.6116,
              3.1158
            ],
            "text": "Owner Full Name",
            "words": [
              {
                "boundingBox": [
                  1.6116,
                  3.0039,
                  2.1026,
                  3.0039,
                  2.1026,
                  3.1157,
                  1.6116,
                  3.1157
                ],
                "text": "Owner",
                "confidence": 1
              },
              {
                "boundingBox": [
                  2.1541,
                  2.9999,
                  2.3784,
                  2.9999,
                  2.3784,
                  3.1158,
                  2.1541,
                  3.1158
                ],
                "text": "Full",
                "confidence": 1
              },
              {
                "boundingBox": [
                  2.4384,
                  3.0052,
                  2.8816,
                  3.0052,
                  2.8816,
                  3.1155,
                  2.4384,
                  3.1155
                ],
                "text": "Name",
                "confidence": 1
              }
            ]
          },
          {
            "boundingBox": [
              2.9993,
              3.0242,
              3.6966,
              3.0242,
              3.6966,
              3.2125,
              2.9993,
              3.2014
            ],
            "text": "Bob Lee",
            "words": [
              {
                "boundingBox": [
                  3.0063,
                  3.0303,
                  3.3439,
                  3.0349,
                  3.3461,
                  3.2125,
                  3.007,
                  3.2081
                ],
                "text": "Bob",
                "confidence": 0.987
              },
              {
                "boundingBox": [
                  3.3788,
                  3.0349,
                  3.6931,
                  3.0326,
                  3.697,
                  3.2121,
                  3.3813,
                  3.2125
                ],
                "text": "Lee",
                "confidence": 0.983
              }
            ]
          },
          {
            "boundingBox": [
              1.945,
              3.5063,
              2.8748,
              3.5063,
              2.8748,
              3.6261,
              1.945,
              3.6261
            ],
            "text": "Owner 电子邮件",
            "words": [
              {
                "boundingBox": [
                  1.945,
                  3.5143,
                  2.4359,
                  3.5143,
                  2.4359,
                  3.6261,
                  1.945,
                  3.6261
                ],
                "text": "Owner",
                "confidence": 1
              },
              {
                "boundingBox": [
                  2.4874,
                  3.5063,
                  2.8748,
                  3.5063,
                  2.8748,
                  3.6259,
                  2.4874,
                  3.6259
                ],
                "text": "Email",
                "confidence": 1
              }
            ]
          },
          {
            "boundingBox": [
              3.0104,
              3.5005,
              4.6042,
              3.5005,
              4.6042,
              3.6888,
              3.0104,
              3.6777
            ],
            "text": "[email protected]",
            "words": [
              {
                "boundingBox": [
                  3.0212,
                  3.5047,
                  4.5837,
                  3.5039,
                  4.5769,
                  3.6886,
                  3.0129,
                  3.6787
                ],
                "text": "[email protected]",
                "confidence": 0.951
              }
            ]
          }
        ]
      }
    ]
  }
}
 
由主持人最后编辑:
Solution
以下将对输出到控制台:
C#:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;

class RootObject
{
    [JsonProperty("analyzeResult")]
    public AnalyzeResult AnalyzeResult { get; set; }
}

class AnalyzeResult
{
    [JsonProperty("readResults")]
    public ReadResults[] ReadResults { get; set; }
}

class ReadResults
{
    [JsonProperty("lines")]
    public Line[] Lines { get; set; }
}

class Line
{
    [JsonProperty("text")]
    public string Text { get; set; }

    public override string ToString() => Text;
}

public static class IEnumerableExtensions
{
    public static IEnumerable<KeyValuePair<T, T>> Pairs<T>(this IEnumerable<T> items)
    {...

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,009
位置
挪威
编程经验
10+
在组分配之后放置一个断点,并在VS中对其进行检查,您可以在其中看到已分组的所有行,并且在每个组内部可以看到组中的字符串。转换为字典/查找仅将每个组中的第一个字符串作为键,其余作为值。
组{"A", "B", "C"} becomes key "A" and value {"B", "C"}(用于字典)或值{{"B", "C"}} for lookup.
群组{"A", "B1", "C1"} and {"A", "B2", "C2"}对字典无效,并成为密钥"A" and value {{"B1", "C1"}, {"B2", "C2"}} for lookup.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,909
位置
英国
编程经验
10+

WeyardWiz

会员
已加入
2020年10月23日
留言内容
23
编程经验
3-5
在组分配之后放置一个断点,并在VS中对其进行检查,您可以在其中看到已分组的所有行,并且在每个组内部可以看到组中的字符串。转换为字典/查找仅将每个组中的第一个字符串作为键,其余作为值。
组{"A", "B", "C"} becomes key "A" and value {"B", "C"}(用于字典)或值{{"B", "C"}} for lookup.
群组{"A", "B1", "C1"} and {"A", "B2", "C2"}对字典无效,并成为密钥"A" and value {{"B1", "C1"}, {"B2", "C2"}} for lookup.
这就是我所看到的。查找为NULL,但是为什么呢?

1605758253042.png

1605758454332.png


System.NullReferenceException
HResult = 0x80004003
Message =对象引用未设置为对象的实例。

1605758688332.png

1605758748060.png
 

WeyardWiz

会员
已加入
2020年10月23日
留言内容
23
编程经验
3-5
I said "Put a breakpoint 小组作业", not at it. On that line groups has not been assigned yet, and you can see in debugger that groups in null too.
哦,我以为进入运算符无论如何都会继续执行。无论如何,我把它放在后面并且serverSetup仍然为NULL ...

1605796942507.png

1605797008294.png

1605797192608.png


有趣的是,我看到关键是"Server Setup"但是没有像字典那样的值!
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,009
位置
挪威
编程经验
10+
我在文章22和38中对此进行了解释,但是您尚未更改代码。元素[0]是第一个值(集合),它包含“结果视图”中列出的字符串。该显示的原因是Linq是需要对其进行迭代评估的查询,您会看到[0]的值是一个 迭代器。 元素[0]也可以通过First扩展方法访问。如果同一键有第二组,该键本来是键下的第二个元素[1],则它也具有与之关联的字符串值的Result View。
 

WeyardWiz

会员
已加入
2020年10月23日
留言内容
23
编程经验
3-5
我在文章22和38中对此进行了解释,但是您尚未更改代码。元素[0]是第一个值(集合),它包含“结果视图”中列出的字符串。该显示的原因是Linq是需要对其进行迭代评估的查询,您会看到[0]的值是一个 迭代器。 元素[0]也可以通过First扩展方法访问。如果同一键有第二组,该键本来是键下的第二个元素[1],则它也具有与之关联的字符串值的Result View。
如果我将代码更改为帖子22中建议的代码,我将得到"V"...
C#:
var serverSetup = lookup["Server Setup"].First().First();
我需要以某种方式保留条件,但是顺序导致的结果不包含任何元素...
C#:
            var serverSetup = lookup["Server Setup"]
                .SkipWhile(s => s.ToString().ToUpper() != "V").First().First();
 

WeyardWiz

会员
已加入
2020年10月23日
留言内容
23
编程经验
3-5
You need to 理解 代码所指的是:

lookup["Server Setup"].First():
查看附件1211

.First();
查看附件1212
天哪,这就是哈哈
C#:
            var serverSetup = lookup["Server Setup"]
                .First().SkipWhile(s => s.ToString().ToUpper() != "V").Skip(1).First();
好的,这很有道理。所以首先我们得到SET,计算表达式,然后得到值。
 
最佳 底部