UWP - 从Json字符串到结构(类)

时间:2016-11-23 14:13:39

标签: json uwp

我从WS收到一个JSon字符串。它已经很久了,我无法使用Json2charp来解析它并接收结构化类。

我想用命令解析字符串。怎么可能?

我不懂课程所以我不能使用如下命令:

Dim result = JsonConvert.DeserializeObject(Of MyClass.RootObject)(String_From_File) 

是否可以从字符串中获取不使用json2charp站点的类? 例如,在vs.net中,如果在变量' string_from_file'我选择了Json Visualizer'并以正确的模式查看所有类和数据。

如何在我的代码中获得相同的内容?

我已经安装了Newtonsoft.json

2 个答案:

答案 0 :(得分:0)

如果你不能使用json来像NewtonSoft.Json这样的类映射器。您可以使用Windows.Data.Json api。它允许您从JSON字符串中解析和提取所需的数据。

JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");

您可以在Windows Universal Sample GitHub中找到示例。

显示复杂对象解析here。我在这里提取了最相关的部分。 JSON字符串提供给User构造函数,该构造函数提取它所需的内容,然后将解析委托给嵌套的School构造函数。

{
  "id": "1146217767",
  "phone": null,
  "name": "Satya Nadella",
  "education": [
    {
      "school": {
        "id": "204165836287254",
        "name": "Contoso High School"
      },
      "type": "High School"
    },
    {
      "school": {
        "id": "116138758396662",
        "name": "Contoso University"
      },
      "type": "College"
    }
  ],
  "timezone": -8,
  "verified": true
}

使用以下代码解析此JSON片段:

    public User(string jsonString) : this()
    {
        JsonObject jsonObject = JsonObject.Parse(jsonString);
        Id = jsonObject.GetNamedString(idKey, "");

        IJsonValue phoneJsonValue = jsonObject.GetNamedValue(phoneKey);
        if (phoneJsonValue.ValueType == JsonValueType.Null)
        {
            Phone = null;
        }
        else
        {
            Phone = phoneJsonValue.GetString();
        }

        Name = jsonObject.GetNamedString(nameKey, "");
        Timezone = jsonObject.GetNamedNumber(timezoneKey, 0);
        Verified = jsonObject.GetNamedBoolean(verifiedKey, false);

        foreach (IJsonValue jsonValue in jsonObject.GetNamedArray(educationKey, new JsonArray()))
        {
            if (jsonValue.ValueType == JsonValueType.Object)
            {
                Education.Add(new School(jsonValue.GetObject()));
            }
        }
    }

    public School(JsonObject jsonObject)
    {
        JsonObject schoolObject = jsonObject.GetNamedObject(schoolKey, null);
        if (schoolObject != null)
        {
            Id = schoolObject.GetNamedString(idKey, "");
            Name = schoolObject.GetNamedString(nameKey, "");
        }
        Type = jsonObject.GetNamedString(typeKey);
    }

如果您不能使用NewtonSoft.Json的自动映射,除了自己动手之外别无他法。

答案 1 :(得分:-1)

不是那么简单。 我收到的Json非常复杂并且有很多课程 所以我不能使用
double width = jsonValue.GetObject()。GetNamedNumber(“Width”);

Inside class i have more ...