首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用文本抽取器后,using忽略导致JsonFunctions.JsonTuple()中JSON异常的行

使用文本抽取器后,using忽略导致JsonFunctions.JsonTuple()中JSON异常的行
EN

Stack Overflow用户
提问于 2019-01-16 12:41:53
回答 2查看 303关注 0票数 1

我正在尝试将JSON文件转换为csv,提取一些感兴趣的特定键/值。我有大型文本文件(> 100万行),其中每一行都是一个JSON对象。实际的结构是嵌套的,包含数组,但是对于这个问题它不应该很重要。

示例文件:

代码语言:javascript
运行
复制
{"param1": val00, "param2": val01}
{"param1": val10, "param2": val11}
...
{"param1": valn0, "param2": valn1}

我在文本抽取器中使用以下代码将每行转换为JSON对象,然后使用JsonFunctions.JsonTuple()解析JSON对象

代码语言:javascript
运行
复制
REFERENCE ASSEMBLY DdaAdlDb.[Newtonsoft.Json];
REFERENCE ASSEMBLY DdaAdlDb.[Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;

@RawExtract = 
    EXTRACT RawString string
    FROM @InputFile 
    USING Extractors.Text(delimiter:'\b', quoting:false);

@json =
    SELECT JsonFunctions.JsonTuple(RawString, "..*") AS RootObject
    FROM @RawExtract;

我遇到了一些问题,因为至少有一条线路是腐败的,如下所示:

代码语言:javascript
运行
复制
{"param1": val00, "param2"{"param1": val10, "param2": val11}
...
{"param1": valn0, "param2": valn1}

这些是我收到的错误消息。

在计算表达式Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(RawString,“..*”时,顶点失败了,出现了一个快速失败的错误E_RUNTIME_USER_EXPRESSIONEVALUATION错误))用户表达式中的内部异常:在解析一个值之后,遇到了一个意想不到的字符:{。 在Newtonsoft.Json.JsonTextReader.ParsePostValue(Boolean ignoreComments,====在Newtonsoft.Json.Linq.JContainer.ReadTokenFrom(JsonReader阅读器的Newtonsoft.Json.JsonTextReader.Read(),JsonLoadSettings设置,在Newtonsoft.Json.Linq.JObject.Load(JsonReader阅读器,JsonLoadSettings设置)的Newtonsoft.Json.Linq.JObject.Load(JsonReader阅读器,JsonLoadSettings设置),Newtonsoft.Json.Linq.JToken.Parse(String json,( Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTupleT at Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(String json,String[] path)在d:\data\yarnnm\local\usercache\45905a29-60cf-4dd2-bf9c-c2b31bedea60\appcache\application_1546207842059_5159256\container_e346_1546207842059_5159256_01_000001\wd__ScopeCodeGen__.dll.cs:line 233中的_Scope_Generated_Classes_.SqlFilterTransformer_13.Process(IRow inRow,IUpdatableRow outRow)

我不介意说几句话。我看到,对于提取器,我可以使用silent: true来忽略坏行。对于JsonFunctions.JsonTuple()解析函数有类似的选项吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-18 06:05:46

为了避免在JsonReaderException上崩溃,可以在U脚本中创建一个try-catch块。

尝试-捕捉块

代码语言:javascript
运行
复制
// Ignore rows with invalid JSON formattting
DECLARE @TryParseJson Func<string, SqlMap<string, string>> = (RawString)=>{
    try 
    {
        return JsonFunctions.JsonTuple(RawString, "..*");
    }
    catch (Newtonsoft.Json.JsonReaderException e)
    {
        return null;  // Consider returning empty SqlMap<string, string> instead
    }
};

提取和解析JSON

每一行包含一个JSON字符串

代码语言:javascript
运行
复制
@RawExtract = 
    EXTRACT RawString string
    FROM @InputFile 
    USING Extractors.Text(delimiter:'\b', quoting:false);

@json =
    SELECT @TryParseJson(RawString) AS RootObject
    FROM @RawExtract;

忽略带有无效JSON (null值)的行

代码语言:javascript
运行
复制
@result =
    SELECT RootObject["id"] AS Id
         , RootObject["status"] AS Status
         , RootObject["time"] AS Time
    FROM @json
    WHERE RootObject != null;  // Ignore invalid JSON
票数 1
EN

Stack Overflow用户

发布于 2019-02-08 11:24:52

JsonTuple没有类似的选项。

我看到了两个解决这个问题的方案。

  1. 创建后面的代码以捕获错误
  2. 编写您自己的JsonFunctions版本来处理错误。

源代码在这里:https://github.com/Azure/usql/blob/master/Examples/DataFormats/Microsoft.Analytics.Samples.Formats/Json/JsonFunctions.cs

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54217316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档