从 C# 中的 JSON 读取特定值

Posted

技术标签:

【中文标题】从 C# 中的 JSON 读取特定值【英文标题】:Read specific value from JSON in C# 【发布时间】:2017-06-08 02:24:00 【问题描述】:

所以我有一个JSON 字符串,我只想读取一个特定的值。如何从下面的字符串中选择“Read me please!”?

var readString = /*Read me please!*/

JSON 字符串:

"\"aString\":\"Read me please!\""

为了更好地理解,我该如何在这里做同样的事情? (只是“Read me please!”):

"\"Result\":
        
    \"aString\":\"Read me please!\",
    \"anotherString\":\"Dont read me!\"
        
"

如果两种选择都有不同的解决方案,我想知道两者。

PS:我不希望将值保存到对象/类中。只是暂时在var readString.

【问题讨论】:

如果你知道它的价值,为什么你需要阅读它?除非您要在 json 文件中搜索用户输入?您需要先尝试解决此问题,然后发布您尝试过的内容。 SO 不是来为你写代码的 @Takarii 我想 read 在我的问题中是一个错误的词。我想从 json 字符串中检索 Read me please!var readString = 看看newtonsoft.com/json 【参考方案1】:

你可以写一个模型:

public class MyModel

    public string AString  get; set; 

然后使用 JSON 序列化器,例如 Json.NET:

string readString = "\"aString\":\"Read me please!\"";
MyModel model = JsonConvert.DeserializeObject<MyModel>(readString);
Console.WriteLine(model.AString);

如果您不想使用第三方解决方案,可以使用内置的javascriptSerializer 类:

string readString = "\"aString\":\"Read me please!\"";
MyModel model = new JavaScriptSerializer().Deserialize<MyModel>(readString);
Console.WriteLine(model.AString);

现在假设您要处理第二个 JSON 字符串,您可以简单地调整您的模型:

public class Wrapper

    public MyModel Result  get; set; 


public class MyModel

    public string AString  get; set; 
    public string AnotherString  get; set; 

然后反序列化到这个包装类:

string readString = ... the JSON string in your second example ...;
Wrapper wrapper = JsonConvert.DeserializeObject<Wrapper>(readString);
Console.WriteLine(wrapper.Result.AString);
Console.WriteLine(wrapper.Result.AnotherString);

更新:

如果您不想反序列化为模型,您可以直接这样做:

string readString = "\"aString\":\"Read me please!\"";
var res = (JObject)JsonConvert.DeserializeObject(readString);
Console.WriteLine(res.Value<string>("aString"));

或使用内置的JavaScriptSerializer 类:

string readString = "\"aString\":\"Read me please!\"";
var serializer = new JavaScriptSerializer();
var res = (IDictionary<string, object>)serializer.DeserializeObject(readString);
Console.WriteLine(res["aString"]);

【讨论】:

是否可以在不将其反序列化为对象/模型的情况下读取 JSON?我只想临时读取值。 @user7399041,是的,有可能,我会更新我的答案来告诉你如何做。 @DarinDimitrov - 您更新的答案不会仍然反序列化整个对象吗?我认为你必须直接使用JsonReader 来避免这种情况......如果 OP 想要避免将潜在的大对象完全加载到内存中,这可能是相关的。 @DanField,是的,这会将整个 JSON 加载到内存中并对其进行标记。它比反序列化为强模型更有效,但是如果需要绝对效率,那么您的答案中显示的 JsonReader 是正确的方法。【参考方案2】:
var readString = JObject.Parse(str)["aString"];

或者你的第二个例子:

var readString2 = JObject.Parse(str2)["Result"]["aString"];

【讨论】:

【参考方案3】:

您必须使用 Newtonsoft (JSON.NET) 来完成此操作。然后,您可以通过这种方式访问​​您的 json 属性:

var obj = JsonConvert.DeserializeObject(yourJson);
Console.WriteLine(obj.Result.aString); 

【讨论】:

您没有必须,但您可以让生活更轻松。在 c# 中已经存在一个内置版本(只是不太用户友好)【参考方案4】:

如果您不想反序列化整个内容,Json.NET 还提供了一个 JSON 阅读器。例如:

string json = "\"Result\":              \"aString\":\"Read me please!\",     \"anotherString\":\"Dont read me!\"                 ";

using (var reader = new JsonTextReader(new StringReader(json)))

    while (reader.Read())
    
        if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "aString")
        
            reader.Read();
            Console.Write(reader.Value);
            break;
        

    

Console.ReadKey();

【讨论】:

【参考方案5】:

我尝试编写一个可以读取我的 json 字符串任何部分的通用方法。我在这个线程上尝试了很多答案,但它不适合我的需要。所以这就是我想出的。我在我的服务层使用以下方法从 json 字符串中读取我的配置属性。

    public T getValue<T>(string json,string jsonPropertyName)
                          
        var parsedResult= JObject.Parse(json);

        return parsedResult.SelectToken(jsonPropertyName).ToObject<T>();
    

这就是你将如何使用它:

    var result = service.getValue<List<string>>(json, "propertyName");

因此,您可以使用它来获取 json 字符串中的特定属性并将其转换为您需要的任何内容。

【讨论】:

以上是关于从 C# 中的 JSON 读取特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何在JSON.NET中读取json对象值中的long值数组

从 C# 中的 OperationContext 读取 JSON 格式的请求内容

c#:如何从 List<person> 中的特定索引读取

如何从嵌套的 json 值中提取特定值。?

从数据库列和 C# 中的 textBox 值中扣除值,扣除后的值必须存储在新列中

如何从 SQL 中的列值中提取特定部分(Redshift 平台)