GVKun编程网logo

c++ rapidjson解析多层级json(c# 解析多层json)

14

在这篇文章中,我们将为您详细介绍c++rapidjson解析多层级json的内容,并且讨论关于c#解析多层json的相关问题。此外,我们还会涉及一些关于AndroidJSON解析错误无法转换为JSON

在这篇文章中,我们将为您详细介绍c++ rapidjson解析多层级json的内容,并且讨论关于c# 解析多层json的相关问题。此外,我们还会涉及一些关于Android JSON解析错误无法转换为JSONArray、Android-Gson解析JSON数据(JSON对象/JSON数组)、Android利用Gson解析嵌套多层的Json的简单方法、C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例的知识,以帮助您更全面地了解这个主题。

本文目录一览:

c++ rapidjson解析多层级json(c# 解析多层json)

c++ rapidjson解析多层级json(c# 解析多层json)

如果一个层级为data,其内部又包含一个层级status, 可以直接通过这种方式来跨级访问:

rapidjson::Value& val_status = doc["data"]["status"];

 

#include "json/rapidjson.h"
#include "json/document.h"
#include "json/writer.h"
#include "json/stringbuffer.h"

rapidjson::Document doc;
doc.Parse<0>(data.bytes);

if (doc.HasParseError())
{
    //CCLOG("%s ---> rapidjson parse error!!! %s\n", __FUNCTION__, doc.GetParseError());
    return;
}
else
{
    rapidjson::Value& val_status = doc["data"]["status"];    
    if (val_status.IsInt())
    {
        log("====== val_data_status: %d", val_status.GetInt
    }


}

 

层级太多,提现提取用的比较多的某一层级,减少不必要的上层节点的重复获取,这里节点L需要被多次访问,所以提前把L提取出来,方便之后L内部对象的提取,运算效率上没想太多,应该没有啥区别,rapidjson内部不会傻到用数组遍历

rapidjson::Value& val_L = doc["data"]["result"]["L"];

rapidjson::Value& val_index1 = val_L["index1"];
rapidjson::Value& val_index2 = val_L["index2"];

int index1 = val_index1.IsInt() ? val_index1.GetInt() : 0;
int index2 = val_index2.IsInt() ? val_index2.GetInt() : 0;

 

Android JSON解析错误无法转换为JSONArray

Android JSON解析错误无法转换为JSONArray

我是Android开发人员的新手,我正在尝试编写一个程序来解析网站中的一些JSON并将其输出到ListView中.但是,当我运行我的程序时,我收到错误:(有超过7行与此错误相同)

03-31 05:25:14.296 3196-3196/nazilli.tenispark E/Failed: Json parsing
error: Value
{“0″:”2″,”id”:”2″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-04-01″,”date”:”2017-04-01″,”4″:”20″,”hour”:”20″}
of type org.json.JSONObject cannot be converted to JSONArray

03-31 05:25:14.297 3196-3196/nazilli.tenispark E/Failed: Json parsing error:
Value
{“0″:”3″,”id”:”3″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-04-08″,”date”:”2017-04-08″,”4″:”20″,”hour”:”20″}
of type org.json.JSONObject cannot be converted to JSONArray

我试图解析的JSON是:

{“appointments”:[{“0″:”2″,”id”:”2″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-04-01″,”date”:”2017-04-01″,”4″:”20″,”hour”:”20″},{“0″:”3″,”id”:”3″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-04-08″,”date”:”2017-04-08″,”4″:”20″,”hour”:”20″},{“0″:”4″,”id”:”4″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-04-15″,”date”:”2017-04-15″,”4″:”20″,”hour”:”20″},{“0″:”5″,”id”:”5″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-04-22″,”date”:”2017-04-22″,”4″:”20″,”hour”:”20″},{“0″:”6″,”id”:”6″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-03-24″,”date”:”2017-03-24″,”4″:”17″,”hour”:”17″},{“0″:”7″,”id”:”7″,”1″:”0″,”cid”:”0″,”2″:”1″,”uid”:”1″,”3″:”2017-03-26″,”date”:”2017-03-26″,”4″:”17″,”hour”:”17″},{“0″:”8″,”id”:”8″,”1″:”1″,”cid”:”1″,”2″:”1″,”uid”:”1″,”3″:”2017-03-26″,”date”:”2017-03-26″,”4″:”16″,”hour”:”16″},{“0″:”9″,”id”:”9″,”1″:”2″,”cid”:”2″,”2″:”1″,”uid”:”1″,”3″:”2017-03-26″,”date”:”2017-03-26″,”4″:”15″,”hour”:”15″},{“0″:”10″,”id”:”10″,”1″:”3″,”cid”:”3″,”2″:”1″,”uid”:”1″,”3″:”2017-03-26″,”date”:”2017-03-26″,”4″:”13″,”hour”:”13″}]}

这是我的listview自定义行java

public class adapter_appointment extends ArrayAdapter<String> {
    public adapter_appointment(Context context, String[] data){
        super(context, R.layout.row_layout, data);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        View customView = inflater.inflate(R.layout.row_layout, parent, false);
        String all_data = getItem(position);
        TextView title = (TextView) customView.findViewById(R.id.title);
        //title.setText(all_data.toString());
        try {
            JSONArray array = new JSONArray(all_data);
            JSONObject obj = array.getJSONObject(0);
            Log.d("SUCCESS", "JSON Object: " + obj.toString());
            if (obj.has("date") && !obj.isNull("date")) {
                title.setText(obj.getString("date").toString());
                Log.d("SUCCESS", "Date: " + obj.getString("date").toString());
            } else {
                // Do something
            }
        } catch (Exception e) {
            Log.e("Failed", "Json parsing error: " + e.getMessage());
        }
        return customView;
    }
}

这是json.java

public class my_appointments extends AppCompatActivity {
    ListView lv;
    InputStream is = null;
    String line = null;
    String result = null;
    String[] data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_appointments);

        lv=(ListView) findViewById(R.id.my_appointments);
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());
        //Run
        getData();
        ArrayAdapter adapter = new adapter_appointment(this, data);
        lv.setAdapter(adapter);
    }

    private void getData()
    {
        try {
            URL url = new URL("MY URL");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            is=new BufferedInputStream(con.getInputStream());
            //
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            while((line=br.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            is.close();
            result=sb.toString();
            //
            JSONObject jo = new JSONObject(result);
            JSONArray ja = jo.getJSONArray("appointments");
            data = new String[ja.length()];
            for(int i=0;i<ja.length();i++)
            {
                jo=ja.getJSONObject(i);
                data[i]=jo.toString();
            }
        }
        catch (Exception e)
        {
            e.printstacktrace();
        }
    }
}

如果我不解析:

enter image description here

解决方法:

您的所有数据都包含以下数据.如下所示.

 alldata={"0":"2","id":"2","1":"0","cid":"0","2":"1","uid":"1","3":"2017-04-01","date":"2017-04-01","4":"20","hour":"20"}

所以每次你的列表项从该约会数组中获取数据.所以alldata变量将根据getItem(position)方法的位置进行更改.

所以,alldata是jsonObject.

所以你应该解析如下,

 JSONObject jsonRowData= new JSONObject(allData);
 try{
   jsonRowData.getString("0");
   jsonRowData.getString("id"):
   jsonRowData.getString("1"):
   jsonRowData.getString("cid"):
   jsonRowData.getString("2"):
   jsonRowData.getString("uid"):
   jsonRowData.getString("3");
   jsonRowData.getString("date"):
   jsonRowData.getString("4");
    }catch(Exception e){
    e.printstacktrace();
   }

就像你必须打电话.希望能帮助到你

Android-Gson解析JSON数据(JSON对象/JSON数组)

Android-Gson解析JSON数据(JSON对象/JSON数组)

上一篇博客,Android-解析JSON数据(JSON对象/JSON数组),介绍了使用 org.json.JSONArray;/org.json.JSONObject; 来解析JSON数据;

 

Google Android 还提供来另外一种方式来解析JSON数据,那就是Gson;

Gson是非常方便的JSON解析/封装/处理等等,强大的工具类:

  特点:Gson可以把JSON对象数据->转换映射为Bean对象

       Gson可以把JSON数组数据->转换映射为集合

     Gson可以把Bean对象->转换为JSON对象数据

     Gson可以把集合->转换为JSON数组数据

        ........... 

 

首先要在app/build.gradle配置文件中,导入,Gson支持包

// Gson支持包的导入
implementation ''com.google.code.gson:gson:2.6.2''

 


 

需要解析的JSON数据:

/data/data/liudeli.mynetwork01/files/pottingJSON1

{
    "name":"李四",
    "age":99,
    "hobby":"爱好是练习截拳道"
}

 

/data/data/liudeli.mynetwork01/files/pottingJSONArray1

[
    {
        "name":"君君",
        "age":89,
        "sex":"男"
    },
    {
        "name":"小君",
        "age":99,
        "sex":"女"
    },
    {
        "name":"大君",
        "age":88,
        "sex":"男"
    }
]

 

定义一个Bean
定义的name/age/hobby 必须要和JSON数据里面的一模一样 

package liudeli.mynetwork01.entity;

/**
 * 定义一个Bean
 * 定义的name/age/hobby 必须要和JSON数据里面的一模一样
 * {
 *     "name":"李四",
 *     "age":99,
 *     "hobby":"爱好是练习截拳道"
 * }
 */
public class Student2 {

    private String name;
    private int age;
    private String hobby;

    public Student2(String name, int age, String hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=''" + name + ''\'''' +
                ", age=" + age +
                ", hobby=''" + hobby + ''\'''' +
                ''}'';
    }
}

  

定义的name/age/sex 必须要和JSON数据里面的一模一样

package liudeli.mynetwork01.entity;

/**
 * 定义一个Bean
 * 定义的name/age/sex 必须要和JSON数据里面的一模一样
 *
 * [
 *     {
 *         "name":"君君",
 *         "age":89,
 *         "sex":"男"
 *     },
 *     {
 *         "name":"小君",
 *         "age":99,
 *         "sex":"女"
 *     },
 *     {
 *         "name":"大君",
 *         "age":88,
 *         "sex":"男"
 *     }
 * ]
 */
public class Student {

    private String name;
    private int age;
    private String sex;

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=''" + name + ''\'''' +
                ", age=" + age +
                ", sex=''" + sex + ''\'''' +
                ''}'';
    }
}

 

GsonAnalyzeJSONActivity.java

package liudeli.mynetwork01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;

import liudeli.mynetwork01.entity.Student;
import liudeli.mynetwork01.entity.Student2;

public class GsonAnalyzeJSONActivity extends Activity {

    private final String TAG = GsonAnalyzeJSONActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_gson_analyze);
    }

    /**
     * Gson解析JSON对象
     * {
     *     "name":"李四",
     *     "age":99,
     *     "hobby":"爱好是练习截拳道"
     * }
     */
    public void gonsAnalyzeJSONObject(View view) {
       String jsonData = readFile("pottingJSON1");
       // Log.d(TAG, "jsonData:" + jsonData);

       Gson gson = new Gson();
       Student2 student2 = gson.fromJson(jsonData, Student2.class);
       Log.d(TAG, "gonsAnalyzeJSONObject 解析后的结果:" + student2.toString());
    }

    /**
     * Gson解析JSON数组
     * [
     *     {
     *         "name":"君君",
     *         "age":89,
     *         "sex":"男"
     *     },
     *     {
     *         "name":"小君",
     *         "age":99,
     *         "sex":"女"
     *     },
     *     {
     *         "name":"大君",
     *         "age":88,
     *         "sex":"男"
     *     }
     * ]
     * @param view
     */
    public void gonsAnalyzeJSONArray(View view) {
        String jsonData = readFile("pottingJSONArray1");
        // Log.d(TAG, "jsonData:" + jsonData);

        Gson gson = new Gson();

        /**
         * TypeToken<List<需要映射的Bean对象>>(){}.getType()
         */
        List<Student> list = gson.fromJson(jsonData, new TypeToken<List<Student>>(){}.getType()); // 参数二:需要指定类型,类型来决定解析的集合

        for (Student student: list) {
            Log.d(TAG, "gonsAnalyzeJSONArray 解析后的结果:" + student.toString());
        }

    }

    /**
     * 读取文件里面的字符串
     * @param fileName
     * @return
     */
    private String readFile(String fileName) {
        String result = null;
        try {
            InputStream inputStream = openFileInput(fileName);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte[] bytes = new byte[inputStream.available()];

            inputStream.read(bytes);

            baos.write(bytes, 0,bytes.length);

            result = new String(baos.toByteArray());

            baos.close();
            inputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

 

activity_gson_analyze.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gson解析JSON对象"
        android:onClick="gonsAnalyzeJSONObject"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gson解析JSON数组"
        android:onClick="gonsAnalyzeJSONArray"
        />

</LinearLayout>

 

日志的打印:

使用Gson解析,JSON对象数据:

12-23 23:00:52.108 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONObject 解析后的结果:Student{name=''李四'', age=99, hobby=''爱好是练习截拳道''}

 

使用Gson解析,JSON数组数据:

12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析后的结果:Student{name=''君君'', age=89, sex=''男''}
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析后的结果:Student{name=''小君'', age=99, sex=''女''}
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析后的结果:Student{name=''大君'', age=88, sex=''男''}

 

Android利用Gson解析嵌套多层的Json的简单方法

Android利用Gson解析嵌套多层的Json的简单方法

首先先讲一个比较简单点的例子(最简单的我就不讲啦,网上很多),帮助新手理解Gson的使用方法:

比如我们要解析一个下面这种的Json:

String json = {"a":"100","b":[{"b1":"b_value1","b2":"b_value2"},{"b1":"b_value1","b2":"b_value2"}],
"c":{"c1":"c_value1","c2":"c_value2"}}

首先我们需要定义一个序列化的Bean,这里采用内部类的形式,看起来会比较清晰一些:

public class JsonBean {
      public String a;
      public List<B> b;
      public C c;

      public static class B {
   public String b1;
   public String b2;
     }
  
     public static class C {
   public String c1;
   public String c2;
     }
}

很多时候大家都是不知道这个Bean是该怎么定义,这里面需要注意几点:

1、内部嵌套的类必须是static的,要不然解析会出错;

2、类里面的属性名必须跟Json字段里面的Key是一模一样的;

3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List<B> b,而只用{}嵌套的就定义为 public C c,

具体的大家对照Json字符串看看就明白了,不明白的我们可以互相交流,本人也是开发新手!

 Gson gson = new Gson();
 java.lang.reflect.Type type = new Typetoken<JsonBean>() {}.getType();
 JsonBean jsonBean = gson.fromJson(json,type);

然后想拿数据就很简单啦,直接在jsonBean里面取就可以了!

如果需要解析的Json嵌套了很多层,同样可以可以定义一个嵌套很多层内部类的Bean,需要细心的对照Json字段来定义哦。

以上这篇Android利用Gson解析嵌套多层的Json的简单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

我就废话不多说啦,大家还是直接看代码吧~

[
 {
  "orderNo": "3213123123123",
  "time": "2016-09-09 12:23:33",
  "orderStatus": "1",
  "freeShipping": true,
  "fullCut": 20,
  "originalCost": 340,
  "actualPayment": 320,
  "goods": [
   {
    "UserId": "5",
    "GoodsId": "8",
    "Total": 40,
    "Number": 2,
    "ConCcoin": 0,
    "PayMode": "支付宝",
    "Price": "20.00",
    "goodsImg": "UpLoadImg/GoodsImage/546fda6d-8417-4b8f-bac6-3084dca420a9.jpg",
    "shopname": "两颗牙",
    "goodsTitle": "周村烧饼",
    "manmoney": "200",
    "jianmoney": "20",
    "jianyoufei": "8"
   },
   {
    "UserId": "5",
    "GoodsId": "7",
    "Total": 60,
    "Number": 1,
    "ConCcoin": 0,
    "PayMode": "支付宝",
    "Price": "60.00",
    "goodsImg": "UpLoadImg/GoodsImage/931be419-e9d3-4dae-ae93-5af619c217d9.jpg",
    "shopname": "两颗牙",
    "goodsTitle": "山东特产山东大枣1000g",
    "manmoney": "200",
    "jianmoney": "0",
    "jianyoufei": "10"
   }
  ]
 }
]

上面为要解析的JSON数据

 var json = "[{\"orderNo\": \"3213123123123\",\"time\": \"2016-09-09 12:23:33\",\"orderStatus\":\"1\", \"freeShipping\": true, \"fullCut\": 20,\"originalCost\": 340, \"actualPayment\": 320,\"goods\": [";
   json += " {\"UserId\": \"5\",\"GoodsId\": \"8\", \"Total\": 40, \"Number\": 2, \"Price\": \"20.00\", \"shopname\": \"两颗牙\", \"manmoney\": \"200\", \"jianmoney\": \"0\",\"jianyoufei\": \"10\"},";
   json += " {\"UserId\": \"5\",\"GoodsId\": \"7\", \"Total\": 60, \"Number\": 1, \"Price\": \"60.00\",\"shopname\": \"两颗牙\", \"manmoney\": \"200\", \"jianmoney\": \"0\",\"jianyoufei\": \"10\"},";
 
   json += " ]} ]";
 
   OrderDetails[] datas = JsonConvert.DeserializeObject<OrderDetails[]>(json);
   List<OrderDetailsInsert> insert = new List<OrderDetailsInsert>();
   foreach (OrderDetails data in datas)
   {
    var shopname = string.Empty;//判断是否同一个商家
    foreach (var item in data.goods)
    {
     OrderDetailsInsert getinfo = new OrderDetailsInsert();
     getinfo.orderno = data.orderno;
     getinfo.time = data.time;
     getinfo.orderStatus = data.orderStatus;
     getinfo.actualPayment = data.actualPayment;
     getinfo.orderno = data.orderno;
     if (data.freeShipping == true)
     {
      getinfo.Remark = "此商品符合包邮条件及满" + item.manmoney + "减" + data.fullCut + "条件:订单总金额:" + data.originalCost + "符合满减条件减去:" + data.fullCut + "实际付款金额:" + data.actualPayment;
     }
     else if (!string.IsNullOrEmpty(data.fullCut.ToString()) && data.fullCut != 0)
     {
      getinfo.Remark = "此商品符合满" + item.manmoney + "减" + data.fullCut + "条件:订单总金额:" + data.originalCost + "符合满减条件减去:" + data.fullCut + "实际付款金额:" + data.actualPayment;
     }
     else
     {
      getinfo.Remark = "订单实际付款金额:" + data.actualPayment;
     }
     getinfo.GoodsId = item.GoodsId;
     getinfo.Total = item.Total;
     getinfo.Number = item.Number;
     getinfo.Price = item.Price;
     insert.Add(getinfo);
    }
   }

要用的对象类

 public class OrderDetailsInsert
 {
  public string orderno { get; set; }
  public DateTime time { get; set; }
  public char orderStatus { get; set; } 
  public Decimal actualPayment { get; set; } 
  public int GoodsId { get; set; }
  public string Total { get; set; }
  public int Number { get; set; }
  public string Price { get; set; }
  public string Remark { get; set; }
 } 
 
 public class OrderDetails
 {
  public string orderno { get; set; }
  public DateTime time { get; set; }
  public char orderStatus { get; set; }
  public bool freeShipping { get; set; }
  public Decimal fullCut { get; set; }
  public Decimal originalCost { get; set; }
  public Decimal actualPayment { get; set; } 
  public GoodsInfoList[] goods { get; set; } 
 } 
 
 public class GoodsInfoList
 {
  public int UserId { get; set; }
  public int GoodsId { get; set; }
  public string Total { get; set; }
  public int Number { get; set; }
  public string Price { get; set; }
  public string shopname { get; set; }
  public string manmoney { get; set; }
 
 }

效果图:

补充:c#使用 Newtonsoft.Json 实现多态序列化

有时候会碰到以下情况

1.定义了一个类型为A的字段,但在实例化时使用的是它的派生类B。

2.定义了一个存储基类型A的集合,但实际上里面包含了各种各样的派生类。

上述两种情况在序列化的时候没有问题,但在反序列化的时候程序并不能将其转化为成派生类。

Newtonsoft.Json提供了一个JsonConverter特性,我们可以自定义某个数据的json读写方式以达成多态序列化的目的。

源码链接

1.自定义转化类

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
namespace XFramework.JsonConvter
{
 /// <summary>
 /// 用于多态列表的转化
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public class PolyListConverter<T> : JsonConverter
 {
  public override bool CanConvert(Type objectType)
  {
   return true;
  }
  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
   var jObject = JObject.Load(reader);
   List<T> values = new List<T>();
   foreach (var item in jObject.Properties())
   {
    Type type = Type.GetType(item.Name);
    var value = item.Value.ToObject(type);
    values.Add((T)value);
   }
   return values;
  }
  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
   var values = (List<T>)value;
   JObject jObject = new JObject();
   foreach (var item in values)
   {
    jObject.Add(item.GetType().FullName, JToken.FromObject(item));
   }
   var p = jObject.Properties();
   foreach (var item in p)
   {
    Debug.Log(item.Name);
   }
   serializer.Serialize(writer, jObject);
  }
 }
 /// <summary>
 /// 用于多态序列化
 /// </summary>
 public class PolyConverter : JsonConverter
 {
  public override bool CanConvert(Type objectType)
  {
   return true;
  }
  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
   var jObject = JObject.Load(reader);
   foreach (var item in jObject.Properties())
   {
    Type type = Type.GetType(item.Name);
    var value = item.Value.ToObject(type);
    return value;
   }
   return null;
  }
  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
   JObject jObject = new JObject();
   jObject.Add(value.GetType().FullName, JToken.FromObject(value));
   serializer.Serialize(writer, jObject);
  }
 }
}

2.使用方式

DataBase是自己定义的一个数据基类,按照以下写法,再利用Newtonsoft 的API 序列化和反序列化TestData就可以成功实现多态读写了。

using XFramework.JsonConvter;
using Newtonsoft.Json;
public class TestData
{
 // 对应第一种情况
 [JsonConverter(typeof(PolyConverter))]
 public DataBase datas;
 
 // 对应第二种情况
 [JsonConverter(typeof(PolyListConverter<DataBase>))]
 public List<EquipPowerBase> powerList; 
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文章:
  • C#使用Json.Net对JSON与对象的序列化与反序列化
  • C#对Json进行序列化和反序列化
  • C#使用Json.Net进行序列化和反序列化及定制化
  • C#中Json反序列化的实现方法
  • C#实现JSON字符串序列化与反序列化的方法
  • C#中实现Json序列化与反序列化的几种方式
  • C#实现的json序列化和反序列化代码实例
  • C#实现json的序列化和反序列化实例代码
  • C#对JSON与对象的序列化与反序列化

关于c++ rapidjson解析多层级jsonc# 解析多层json的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android JSON解析错误无法转换为JSONArray、Android-Gson解析JSON数据(JSON对象/JSON数组)、Android利用Gson解析嵌套多层的Json的简单方法、C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例等相关知识的信息别忘了在本站进行查找喔。

本文标签: