C# 即使Json无效,如何解析第一个属性?

C# 即使Json无效,如何解析第一个属性?,c#,json.net,C#,Json.net,我正在解析大量不同的JSON,它们只有第一个共同属性。 根据第一个属性的值,我将json解析为不同的对象,并以不同的方式处理可能的错误。然而,json是无效的,但我仍然想知道第一个属性的值(只要它是有效的),这样我就可以处理解析错误。我想知道这是否可以通过Json.Net实现。当然,我假设至少第一个属性是有效的,例如: { "parsingType":"sometype", "someothervalue":123, "someval"123, } using System;

我正在解析大量不同的JSON,它们只有第一个共同属性。 根据第一个属性的值,我将json解析为不同的对象,并以不同的方式处理可能的错误。然而,json是无效的,但我仍然想知道第一个属性的值(只要它是有效的),这样我就可以处理解析错误。我想知道这是否可以通过
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
解析值,但我认为有一个更简单的解决方案