C# 即使Json无效,如何解析第一个属性?
我正在解析大量不同的JSON,它们只有第一个共同属性。 根据第一个属性的值,我将json解析为不同的对象,并以不同的方式处理可能的错误。然而,json是无效的,但我仍然想知道第一个属性的值(只要它是有效的),这样我就可以处理解析错误。我想知道这是否可以通过C# 即使Json无效,如何解析第一个属性?,c#,json.net,C#,Json.net,我正在解析大量不同的JSON,它们只有第一个共同属性。 根据第一个属性的值,我将json解析为不同的对象,并以不同的方式处理可能的错误。然而,json是无效的,但我仍然想知道第一个属性的值(只要它是有效的),这样我就可以处理解析错误。我想知道这是否可以通过Json.Net实现。当然,我假设至少第一个属性是有效的,例如: { "parsingType":"sometype", "someothervalue":123, "someval"123, } using System;
Json.Net
实现。当然,我假设至少第一个属性是有效的,例如:
{
"parsingType":"sometype",
"someothervalue":123,
"someval"123,
}
using System;
using System.IO;
using Newtonsoft.Json;
public class Test
{
static void Main(string[] args)
{
using (var reader = new JsonTextReader(File.OpenText("test.json")))
{
while (reader.Read())
{
Console.WriteLine(reader.TokenType);
Console.WriteLine(reader.Value);
}
}
}
}
我尝试了以下操作,但由于在使用.Parse
时引发异常,因此没有得到任何结果:
JToken jtoken = JToken.Parse(json);
var theValueIWantToGet = jtoken["parsingType"].Value<string>();
JToken-JToken=JToken.Parse(json);
var theValueIWantToGet=jtoken[“parsingType”].Value();
我认为任何解析引擎都不会部分解析json。如果解析器失败,您必须自己解析json字符串
string json = "{ \"parsingType\":\"sometype\", \"someothervalue\":12}";
var props = json.Replace('{',' ').Replace('}',' ').Split(',').ToList();
if (props.Count > 0)
{
var firstProp = props[0].Split(':');
var propName = firstProp[0];
var propVal = firstProp[1];
}
您可以使用a(可能作为具体类型)将JSON解析为流,有点像XmlReader
。例如:
{
"parsingType":"sometype",
"someothervalue":123,
"someval"123,
}
using System;
using System.IO;
using Newtonsoft.Json;
public class Test
{
static void Main(string[] args)
{
using (var reader = new JsonTextReader(File.OpenText("test.json")))
{
while (reader.Read())
{
Console.WriteLine(reader.TokenType);
Console.WriteLine(reader.Value);
}
}
}
}
在您提供的JSON上,将提供以下输出:
StartObject
PropertyName
parsingType
String
sometype
PropertyName
someothervalue
Integer
123
Unhandled Exception: Newtonsoft.Json.JsonReaderException [...]
因此,如果您总是希望有一个开始对象,然后是一个属性名,然后是一个字符串属性值,那么您可以轻松地验证这种情况并提取属性值。既然您只对这个值感兴趣,为什么还要费心解析它呢?只需进行字符串搜索。它也会更快。你到底在用JSON做什么?或者更确切地说,你是从哪里得到它的?如果它来自您自己的应用程序或服务,您可以使用
JsonSerializerSettings
添加typenameholling.All
和FormatterAssemblyStyle.Simple
,它允许反序列化程序识别并在程序集中找到正确的类型。请尝试使用JsonReader,如中所示。我不确定在没有json.net的情况下如何获取值,因为我得到了一个字符串并将使用使用StringEnumConverter
从中获取枚举。json确实来自一个我没有任何控制权的外部服务。首先我真的需要ony第一个属性(如果可能的话,稍后我会解析其余的属性)。我可以在第一个,
处剪切字符串,并用}
替换它,然后用StringEnumConverter
解析值,但我认为有一个更简单的解决方案