Java的"org.json"vs C#的"Newtonsoft.Json.JsonConvert"

spo*_*rts 2 c# json json.net org.json

我正在寻找一个C#(.NET)库,它将字符串化的JSON解析为Object.

这个问题Newtonsoft.Json.JsonConvert对我来说,就是你总是需要反序列化的具体类型:

 SomePredefinedType bla = JsonConvert.DeserializeObject<SomePredefinedType>(stringifiedJson);
Run Code Online (Sandbox Code Playgroud)

所以我结束了许多我不再使用的课程.
somePredefinedType类在该行中使用一次,而且永远不会更多.

当然导航更好,你可以调用属性,如:

string name = bla.Name;
string age = bla.Age;
Run Code Online (Sandbox Code Playgroud)

Java中,我使用了org.json,其中反序列化就像这样:

JSONObject jsonObject = new JSONObject(stringifiedJson)
Run Code Online (Sandbox Code Playgroud)

导航要求您知道JSON结构是什么.但这总是事实(否则我怎么能创建这个SomePredefinedType类?)

jsonObject.getString("Name");
jsonObject.getString("Age");
Run Code Online (Sandbox Code Playgroud)

问题是:
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;
        }
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 7

对我来说,Newtonsoft.Json.JsonConvert的问题是你总是需要一个具体的反序列化类型:

不必要:

dynamic result = JsonConvert.DeserializeObject("{\"Name\":\"John\",\"Age\":12}");
string name = result.Name;
int age = result.Age;
Run Code Online (Sandbox Code Playgroud)

或者:

var result = JObject.Parse("{\"Name\":\"John\",\"Age\":12}");
string name = result["Name"].Value<string>();
int age = result["Age"].Value<int>();
Run Code Online (Sandbox Code Playgroud)

如果您不想使用第三方库,则可以使用内置的.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"];
Run Code Online (Sandbox Code Playgroud)

  • 是的,但如果你关心性能速度,你不应该使用JSON.NET,这与[`ServiceStack.Text`](https://github.com/ServiceStack/ServiceStack.Text)相比非常慢 (2认同)