我正在寻找一个 C#(.NET)库,它将字符串化的JSON解析为一个Object。
Newtonsoft.Json.JsonConvert
给我的问题是,你总是需要一个具体的反序列化类型:
SomePredefinedType bla = JsonConvert.DeserializeObject<SomePredefinedType>(stringifiedJson);
所以我结束了很多我不再使用的课程了 somePredefinedType在该行中使用一次,而不再使用。
当然导航更好,您可以调用属性,如:
string name = bla.Name;
string age = bla.Age;
在 Java 中,我使用了org.json,其中反序列化就像这样:
JSONObject jsonObject = new JSONObject(stringifiedJson)
导航要求您知道JSON结构是什么。但这始终是一个事实(否则我怎么能创建SomePredefinedType
类?)
jsonObject.getString("Name");
jsonObject.getString("Age");
问题是:
C#有一个org.json吗?我不喜欢Newtonsoft.Json
我喜欢这种匿名解析方式。
修改 好吧,我倾向于在帖子中使用简化的例子,因为当人们发布一堆代码时我不喜欢。我喜欢在此基础上发言,这就是我发布简单代码的原因。
这是我无法以简单的方式实现的,就像使用org.json一样:
// Here not using any object, just as answers below stated I could:
dynamic jsonProviders = JsonConvert.DeserializeObject(stringifiedJson);
foreach (dynamic jsonProvider in jsonProviders)
{
// Fetch provider
SMSProvider provider = db.SMSProviders.SingleOrDefault(p => p.SMSProviderId == jsonProvider.SMSProviderId); // What the hell do I use here? thats an error
CheckIfExists(provider);
provider.Order = jsonProvider.Order;
}
答案 0 :(得分:7)
对我来说,Newtonsoft.Json.JsonConvert的问题在于你 总是需要一个具体类型来反序列化:
不一定:
dynamic result = JsonConvert.DeserializeObject("{\"Name\":\"John\",\"Age\":12}");
string name = result.Name;
int age = result.Age;
可替换地:
var result = JObject.Parse("{\"Name\":\"John\",\"Age\":12}");
string name = result["Name"].Value<string>();
int age = result["Age"].Value<int>();
如果您不想使用第三方库,您可以使用内置的.NET JavaScriptSerializer
类获得类似的结果:
var serializer = new JavaScriptSerializer();
var result = (IDictionary<string, object>)serializer.DeserializeObject("{\"Name\":\"John\", \"Age\":12}");
string name = (string)result["Name"];
int age = (int)result["Age"];
答案 1 :(得分:2)
更新,我说你差不多完成了。你可以这样做:
int id = jsonProvider.SMSProviderId;
SMSProvider provider = db.SMSProviders.SingleOrDefault(p => p.SMSProviderId == id);
以这种方式捕获id
应该让EF(或其他任何东西)准确理解如何使用来自JSON的值。
Json.NET(JsonConvert)是一个很棒的库。以下是一些选项,可以在不需要更多类的情况下完成所需的操作:
// stringifiedJson is {"Name":"George","Age":25}
{
dynamic deserializedDynamic = JsonConvert.DeserializeObject(stringifiedJson);
string name = deserializedDynamic.Name;
int age = deserializedDynamic.Age;
}
{
var deserializedAnon = JsonConvert.DeserializeAnonymousType(stringifiedJson,
new { Name = default(string), Age = default(int) });
string name = deserializedAnon.Name;
int age = deserializedAnon.Age;
}
{
var deserializedDict =
JsonConvert.DeserializeObject<Dictionary<string, object>>(stringifiedJson);
string name = (string)deserializedDict["Name"];
// Age is a long, two casts required
int age = (int)(long)deserializedDict["Age"];
}
{
var deserializedDictDyn =
JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(stringifiedJson);
string name = deserializedDictDyn["Name"];
// Age is a long, one cast required with dynamic
int age = (int)deserializedDictDyn["Age"];
}
{
var deserializedJObject = JObject.Parse(stringifiedJson);
string name = (string)deserializedJObject.GetValue("Name");
int age = (int)deserializedJObject.GetValue("Age");
}