在 C# 中从 JSON 中读取特定值
Read specific value from JSON in C#
所以我有一个 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: 我不想将值保存到 object/class 左右。只是暂时在 var readString
.
里面
你可以写一个模型:
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);
如果您不想使用第三方解决方案,您可以使用 built-in JavaScriptSerializer
class:
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; }
}
然后反序列化到这个包装器 class:
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"));
或与 built-in JavaScriptSerializer
class:
string readString = "{\"aString\":\"Read me please!\"}";
var serializer = new JavaScriptSerializer();
var res = (IDictionary<string, object>)serializer.DeserializeObject(readString);
Console.WriteLine(res["aString"]);
您必须使用 Newtonsoft (JSON.NET) 来完成它。然后,您可以通过以下方式访问您的 json 属性:
var obj = JsonConvert.DeserializeObject(yourJson);
Console.WriteLine(obj.Result.aString);
var readString = JObject.Parse(str)["aString"];
或者你的第二个例子:
var readString2 = JObject.Parse(str2)["Result"]["aString"];
Json.NET 还提供了一个 JSON reader 如果你不想反序列化整个事情。例如:
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();
我尝试编写一个可以读取 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 字符串中的特定属性并将其转换为您需要的任何内容。
所以我有一个 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: 我不想将值保存到 object/class 左右。只是暂时在 var readString
.
你可以写一个模型:
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);
如果您不想使用第三方解决方案,您可以使用 built-in JavaScriptSerializer
class:
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; }
}
然后反序列化到这个包装器 class:
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"));
或与 built-in JavaScriptSerializer
class:
string readString = "{\"aString\":\"Read me please!\"}";
var serializer = new JavaScriptSerializer();
var res = (IDictionary<string, object>)serializer.DeserializeObject(readString);
Console.WriteLine(res["aString"]);
您必须使用 Newtonsoft (JSON.NET) 来完成它。然后,您可以通过以下方式访问您的 json 属性:
var obj = JsonConvert.DeserializeObject(yourJson);
Console.WriteLine(obj.Result.aString);
var readString = JObject.Parse(str)["aString"];
或者你的第二个例子:
var readString2 = JObject.Parse(str2)["Result"]["aString"];
Json.NET 还提供了一个 JSON reader 如果你不想反序列化整个事情。例如:
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();
我尝试编写一个可以读取 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 字符串中的特定属性并将其转换为您需要的任何内容。