GVKun编程网logo

浅谈使用java解析和生成JSON(java 生成json)

15

在本文中,我们将给您介绍关于浅谈使用java解析和生成JSON的详细内容,并且为您解答java生成json的相关问题,此外,我们还将为您提供关于2018-09-13代码翻译尝试-使用Roaster解析

在本文中,我们将给您介绍关于浅谈使用java解析和生成JSON的详细内容,并且为您解答java 生成json的相关问题,此外,我们还将为您提供关于2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码、C# 中 Json 解析和生成、Go Web编程--解析JSON请求和生成JSON响应、Golang 如何解析和生成json的知识。

本文目录一览:

浅谈使用java解析和生成JSON(java 生成json)

浅谈使用java解析和生成JSON(java 生成json)

JSON概述

JSON即javascript object notation,是javascript对象表示法的子集。具有以下特点:

数据放在键值对中;
数据由逗号分隔;
花括号表示对象;
方括号表示数组。

JSON的值可以是:

数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true或false)
数组(方括号内)
对象(花括号内)
null

JSON的基本语法

JSON对象

JSON对象在花括号中书写,对象可以包含多个键值对,例如:

{
  "firstName":"John","lastName":"Doe"
}

JSON数组

JSON数组在方括号中书写,数组中可以包含多个对象,例如:

{
  "employees":[
    {"firstName":"John","lastName":"Doe"},{"firstName":"Anna","lastName":"Smith"},{"firstName":"Peter","lastName":"Jones"}
  ]
}

在以上的实例中,根部的花括号表示这是一个JSON对象,该对象的键是employees,值是一个JSON数组,在这个数组中有3个JSON对象,每个JSON对象之间也使用逗号分隔。

使用java读取JSON数据

在JSON官网我们可以查看到各个语法对json的支持,对于java来说比较成熟的是google-gson。

其maven依赖如下:

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.2.4</version>
</dependency>

现在编写程序解析以下的test.json:

{
  "cat":"it","languages":[
    {"id":1,"ide":"Eclipse","name":"Java"},{"id":2,"ide":"Xcode","name":"Swift"},{"id":3,"ide":"Visual Studio","name":"C#"}
  ],"pop":true
}

以下的代码将解析以上的json数据:

public void readJSON() throws Exception{

  // 创建json解析器
  JsonParser parser = new JsonParser(); 
  // 使用解析器解析json数据,返回值是JsonElement,强制转化为其子类JsonObject类型
  JsonObject object = (JsonObject) parser.parse(new FileReader("test.json"));

  // 使用JsonObject的get(String memeberName)方法返回JsonElement,再使用JsonElement的getAsXXX方法得到真实类型
  System.out.println("cat = " + object.get("cat").getAsstring());

  // 遍历JSON数组
  JsonArray languages = object.getAsJsonArray("languages");
  for (JsonElement jsonElement : languages) {
    JsonObject language = jsonElement.getAsJsonObject();
    System.out.println("id = " + language.get("id").getAsInt() + ",ide = " + language.get("ide").getAsstring() + ",name = " + language.get("name").getAsstring());
  }

  System.out.println("pop = " + object.get("pop").getAsstring());
}

使用java生成JSON数据

生成JSON数据的关键是JSON对象中的add和addProperty两个方法。前者用于向JSON对象中添加数组或者另一个JSON对象,后者用于为JSON对象添加属性。以下的代码将生成上面例子中的test.json。

public void createJSON() throws IOException{

  JsonObject object = new JsonObject(); // 创建一个json对象
  object.addProperty("cat","it");    // 为json对象添加属性  

  JsonArray languages = new JsonArray(); // 创建json数组
  JsonObject language = new JsonObject();
  language.addProperty("id",1);
  language.addProperty("ide","Eclipse");
  language.addProperty("name","java");
  languages.add(language);        // 将json对象添加到数组 

  language = new JsonObject();
  language.addProperty("id",2);
  language.addProperty("ide","XCode");
  language.addProperty("name","Swift");
  languages.add(language);

  language = new JsonObject();
  language.addProperty("id",3);
  language.addProperty("ide","Visual Studio");
  language.addProperty("name","C#");
  languages.add(language);

  object.add("languages",languages);  // 将数组添加到json对象  
  object.addProperty("pop",true);

  String jsonStr = object.toString();  // 将json对象转化成json字符串
  PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("data.json")));
  pw.print(jsonStr);
  pw.flush();
  pw.close();
}

在JAVA中构造和解析JSON我用的是org.json,下面是两个函数,一个是创建JSON,一个是从文本构造JSON并解析之。

创建json

//construct json and output it  
public String jsontest() throws JSONException{ 
  JSONObject json=new JSONObject(); 
  JSONArray jsonMembers = new JSONArray(); 
  JSONObject member1 = new JSONObject(); 
  member1.put("loginname","zhangfan"); 
  member1.put("password","userpass"); 
  member1.put("email","10371443@qq.com"); 
  member1.put("sign_date","2007-06-12"); 
  jsonMembers.put(member1); 
 
  JSONObject member2 = new JSONObject(); 
  member2.put("loginname","zf"); 
  member2.put("password","userpass"); 
  member2.put("email","8223939@qq.com"); 
  member2.put("sign_date","2008-07-16"); 
  jsonMembers.put(member2); 
  json.put("users",jsonMembers); 
 
  return json.toString(); 
} 

 解析json

//construct json from String and resolve it. 
public String jsonTest2() throws JSONException{ 
  String jsonString="{\"users\":[{\"loginname\":\"zhangfan\",\"password\":\"userpass\",\"email\":\"10371443@qq.com\"},{\"loginname\":\"zf\",\"email\":\"822393@qq.com\"}]}"; 
  JSONObject json= new JSONObject(jsonString); 
  JSONArray jsonArray=json.getJSONArray("users"); 
  String loginNames="loginname list:"; 
  for(int i=0;i<jsonArray.length();i++){ 
    JSONObject user=(JSONObject) jsonArray.get(i); 
    String userName=(String) user.get("loginname"); 
    if(i==jsonArray.length()-1){ 
      loginNames+=userName; 
    }else{ 
      loginNames+=userName+","; 
    } 
  } 
  return loginNames; 
} 

 JAVA中处理JSON还是相当方便的。

2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码

2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码

此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and Refactoring, 选了一个综合代价看来最小的, forge/roaster, 因为它同时具备解析和生成两方面功能.

初步汉化后代码效果如下(尚未有语法高亮, 仅作演示用. 之后的在线翻译结果也是同样处理):

package com.company.example;

import java.io.Serializable;

public class 人 implements Serializable {

	private static final long serialVersionUID = 1L;
	private final 整型 号;
	private 字符串 全名;

	public 整型 get号() {
		return 号;
	}

	public 字符串 get全名() {
		return 全名;
	}

	public void set全名(字符串 全名) {
		this.全名 = 全名;
	}

	public 人(java.lang.Integer id) {
		this.id = id;
	}
}

实现的源码在: https://github.com/program-in-chinese/java_code_translator/blob/8c038261bd797d9738de182f3e0f8ac111402704/src/main/java/com/codeinchinese/code_translator/%E7%BF%BB%E8%AF%91Java%E4%BB%A3%E7%A0%81.java

相关实现比较简单. 因为侧重代码解析生成, 翻译部分最简化(采用纯映射表):

  static Map<String, String> 字典 = new HashMap<>();
  static {
    字典.put("id", "号");
    字典.put("fullName", "全名");
    字典.put("getId", "取号");

    字典.put("Integer", "整型");
    字典.put("String", "字符串");

    字典.put("Person", "人");
  }

  public static void main(String[] 参数) throws Exception {
    String 源码 = 文件功用.取源文件文本("测试.java");
    JavaClassSource 分析结果 = Roaster.parse(JavaClassSource.class, 源码);

    // 汉化类名
    分析结果.setName(查词(分析结果.getName()));

    // 汉化Bean属性名, 以及属性的类型名
    for (PropertySource<JavaClassSource> 某属性 : 分析结果.getProperties()) {
      String 属性名 = 某属性.getName();
      某属性.setName(查词(属性名));

      String 属性类型名 = 某属性.getType().getName();
      某属性.setType(查词(属性类型名));
    }

    System.out.println(分析结果);
  }

  private static String 查词(String 英文) {
    return 字典.containsKey(英文) ? 字典.get(英文) : 英文;
  }

Roaster一大缺陷是, 还不支持对方法内容的解析: ROASTER-1: Java Statement Fluent Model by sotty · Pull Request #27 · forge/roaster 貌似主创最近不很活跃, 很可能需要另辟蹊径.

顺便把源码用在线翻译服务翻译一下进行比较.

谷歌几乎没有翻译:

package com.company.example;

import java.io.Serializable;

public class Person实现Serializable {

     private static final long serialVersionUID = 1L;
     private final Integer id;
     private String fullName;

     public Integer getId(){
         返回id;
    }

     public String getFullName(){
         return fullName;
    }

     public void setFullName(String fullName){
         this.fullName = fullName;
    }

     public Person(java.lang.Integer id){
         this.id = id;
    }
}

百度改变源码太大:

包装公司。
导入JavaIO.SerialCalab化;
公共类人谓词可序列化{
私有静态最终的长序列化版本UID=1L;
私有最终整数ID;
私有字符串全名;
公共整数gTiID()
序列标识;
}
公共字符串GETFuleNAMEL()
返回全名;
}
公共空隙设置FULL NULL(String FulnNeX){
全名=全名;
}
公共人(java.郎.整数ID){
这个ID=ID;
}
}

个人感觉即使是这样初步的翻译, 也是有优势的. 至于编程语言关键词不翻译, 尚不是致命问题, 毕竟下面打算与英汉词典API结合一下试试(这里有一点初步尝试, 对释义的选取还需改进). 如效果还可以接受就上线做一下内测.

C# 中 Json 解析和生成

C# 中 Json 解析和生成

C#Json 解析和生成

当年自己是新手时,用 C# 写程序,在 C# 中解析 Json 着实头疼了一把。同事在用一个叫 Newtonsoft.json 的 dll,使用方法不是很舒服,每次都得调.net 版本;让人烦不胜烦。说真的,我倒现在还没弄熟 Newtonsoft.json 的用法,类是继承的,这玩意就很难调。我们用的 json 做协议,每个格式又不完全一样。。。
我们平常都是小软件一个人能完成的,急需要一个小巧又舒适的库,满足需求即可。索性自己写了一个,千行以内;不需要 dll,不需要第三方组件,随时改.net 版本,不需要调 dll 版本;能快速生成和解析自己需要的数据。源码开放,代码量少,随时可修改。
下载地址:
GitHub:https://github.com/NingShenTian/CsharpJson
码云:https://git.oschina.net/xiaoguozhier/CsharpJson

使用方法:

生成 Josn:

using CsharpJson;
namespace test
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            //Json对象
            JsonObject child = new JsonObject();
            //下标形式添加键值对
            child["china"] = "hello";
            child["shanghai"] = 123;
            //调用Add方法添加键值对
            child.Add("one", "abc");
            child.Add("two", 12);
            child.Add("three", 44.9);
            //Json数组
            JsonArray arr = new JsonArray();
            arr[0] = true;
            arr[1] = 100;
            arr[2] = "你好";
            arr.Add("12");
            arr.Add(456);
            arr.Add(false);
            arr.Add(child);
            JsonObject obj = new JsonObject();
            obj.Add("中国", "china");
            obj.Add("北京", true);
            obj.Add("上海", 123);
            obj.Add("NULL",null);
            //添加对象
            obj.Add("childobj", child);
            //添加数组
            obj.Add("arrayvalue", arr);
            //定义Json文档解析类
            JsonDocument doc=new JsonDocument();
            //给文档解析类obj对象
            doc.Object=obj;
            //生成
            string val = doc.ToJson();
            Console.WriteLine("生成的Json字符串:");
            Console.WriteLine(val);
        }
    }
}

解析 Json:

string data = "{\"中国\": \"china\",\"北京\": true,\"上海\": 123}";
//定义解析Json文档解析类
JsonDocument doc = JsonDocument.FromString(data);
//判断是否是object类型
if(doc.IsObject())
{
    //解析成object
    JsonObject jsobj = doc.Object;
    //遍历键值对
    foreach(string key in jsobj.Keys)
    {
        //判断类型,然后输出
        switch(jsobj[key].Valuetype)
        {
            case JsonType.BOOL:    //bool型
                Console.WriteLine("key={0},value={1}",key,jsobj[key].ToBool());
                break;
            case JsonType.NUMBER:    //数字类型
                Console.WriteLine("key={0},value={1}",key,jsobj[key].ToInt());
                break;
            case JsonType.STRING:    //字符串
                Console.WriteLine("key={0},value={1}",key,jsobj[key].ToString());
                break;
        }
    }
}

Go Web编程--解析JSON请求和生成JSON响应

Go Web编程--解析JSON请求和生成JSON响应

现在无论是网站、App、小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都JSON格式是一个比较好的选择,所以接口的数据格式通常都采用JSON,即前端在发送POSTPUTPATCH请求添加,更改数据时会把数据以JSON格式放到请求的Body中。而后端则是所有数据都会以JSON格式返回。

关于JSON可读性、编码数据大小和开发者使用难度上,因为其可读性不如XML结构,但是数据量小,用程序操作起来更方便。对比Protobuf来说,Protobuf编码速度、编码后数据大小比JSON都要好,但是用程序操作起来没有JSON方便简单,编码后的数据是二进制格式的,易读性完全没有。所以整体来说JSON是一个各个方面都不错更容易被所有人接受才被广泛使用的(以上都是个人观点)。

之前也写过两篇关于用Go语言解码和编码JSON数据的文章

  • 如何控制Go编码JSON数据时的行为
  • 学会用Go解析复杂JSON的思路

那么针对Web编程我们其实只要关注怎么从HTTP请求的Body中读取到JSON数据,以及如何将要返回给客户端的数据以JSON格式写入到HTTP响应中。

从请求体读取JSON数据

关于这部分内容其实在之前的文章深入学习解析HTTP请求里有说过。

我们需要把请求体作为json.NewDecoder()的输入流,然后将请求体中携带的JSON格式的数据解析到声明的结构体变量中

//handler/parse_json_request
package handler

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type Person struct {
    Name string
    Age  int
}

func DisplayPersonHandler(w http.ResponseWriter, r *http.Request) {
    var p Person

    // 将请求体中的 JSON 数据解析到结构体中
    // 发生错误,返回400 错误码
    err := json.NewDecoder(r.Body).Decode(&p)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    
    fmt.Fprintf(w, "Person: %+v", p)
}

// router/router.go
indexRouter.HandleFunc("/parse_json_request", handler.ParseJsonRequestHandler)

在命令行里用cURL命令测试我们的程序:

curl -X POST -d ''{"name": "James", "age": 18}'' \
     -H "Content-Type: application/json" \
     http://localhost:8000/index/parse_json_request

把JSON数据写入响应

与上面相反,将返回数据以JSON格式写入响应时,我们调用json.NewEncodeer(w).Encode(&v),用响应体作为输入流创建JSON编码器,然后使用其Encode()方法将数据编码为JSON格式并写入响应体。

// handler/write_json_response
package handler

import (
    "encoding/json"
    "net/http"
)

type User struct {
    FirstName string `json:"firstname"`
    LastName  string `json:"lastname"`
    Age       int    `json:"age"`
}

func WriteJsonResponseHandler(w http.ResponseWriter, r *http.Request) {
    p := User{
        FirstName: "John",
        LastName:  "Doe",
        Age:       25,
    }
  // Set response header
    w.Header().Set("Content-Type", "application/json")
    err := json.NewEncoder(w).Encode(&p)
    if err != nil {
        //... handle error
    }
}

// router/router.go
indexRouter.HandleFunc("/get_json_response", handler.WriteJsonResponseHandler)

重启服务器后在命令行里用cURL命令测试我们的程序:

curl -X GET http://localhost:8000/index/get_json_response
{"firstname":"John","lastname":"Doe","age":25}

今天的内容很简单,源码已经上传,公众号回复gohttp12获取文中源代码的下载链接。

前文回顾

深入学习用Go编写HTTP服务器

Go Web编程--应用ORM

Go Web 编程--超详细的模板库应用指南

Go Web编程--使用Go语言创建静态文件服务器

Go Web编程--给自己写的服务器添加错误和访问日志

第1页.png

Golang 如何解析和生成json

Golang 如何解析和生成json

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域。

Golang自带的JSON解析库encoding/json,可以用起将结构化数据序列化成json字符串或从json字符串中解析出我们想要的数据。

1.解析json

给一个较为复杂的json字符串,包含数组,数组的元素是json对象。我们需要取出数组第一个元素中的某一个字段值。其它的解析均可参考下面的代码。

package main

import (
  "encoding/json"
  "fmt"
)

func main() {
    jsonStr := []byte(`{"uin":1589276509,"feedID":10000,"videos":[{"picture":"http://qqpublic.qpic.cn/avatar.jpg","duration":"839"}]}`)
    var jsonMap map[string]interface{}
    if err := json.Unmarshal(jsonStr, &jsonMap); err!=nil {
      fmt.Printf("json decode failed, err=%v", err)
      return
    }
    value, ok:=jsonMap["videos"]
    fmt.Printf("value=%#v\n", value)
    if ok {
        sliceValue, ok := value.([]interface{})
        if ok {
            mapValue, ok := sliceValue[0].(map[string]interface{})
            if ok {
                duration, ok := mapValue["duration"]
                if ok {
                    fmt.Printf("d=%v,type=%T\n",duration,duration)
                }
            }
        }
    }
}

程序输出:

value=[]interface {}{map[string]interface {}{"picture":"http://qqpublic.qpic.cn/avatar.jpg", "duration":"839"}}
d=839,type=string

解析json字符串时,需要注意如下几点:
(1)Go类型和JSON类型的对应关系如下:

map[string]interface{}代表JSON对象
[]interface{}代表JSON数组
bool代表JSON booleans
float64代表JSON numbers
string代表JSON strings
nil 代表JSON null

2.生成json

假设我们有如下一个类(结构体)student 及其一个实例对象st,将其序列化为json,具体实现如下:

package main

import (
  "encoding/json"
  "fmt"
)

type Stu struct {
  Name string `json:"name"`
  Age  int
  sex  string
  Class *Class `json:"class"`
}

type Class struct {
  Name string
  Grade int
}

func main() {
//实例化一个数据结构,用于生成json字符串
  stu := Stu{
    Name: "张三",
    Age: 18,
    sex: "男",
  }

  //指针变量
  cla := new(Class)
  cla.Name = "1班"
  cla.Grade = 3
  stu.Class=cla

  //Marshal失败时err!=nil
  jsonStu, err := json.Marshal(stu)
  if err != nil {
    fmt.Println("生成json字符串错误")
  }

  //jsonStu是[]byte类型,转化成string类型便于查看
  fmt.Println(string(jsonStu))
}

程序输出结果:

{"name":"张三","Age":18,"class":{"Name":"1班","Grade":3}}

阅读以上代码可以看出:

(1)只要是可导出成员(变量首字母大写),都可以转成json。因成员变量sex是不可导出的,故无法转成json;

(2)如果变量打上了json标签,如Name旁边的 json:"name" ,那么转化成的json key就用该标签“name”,否则取字段名作为key,如"Age";

(3)指针变量,编码时自动转换为它所指向的值,如Class变量;

(4)强调一句,序列化成功后的json字符串是纯粹的字符串。

以上就是Golang 如何解析和生成json的详细内容,更多关于golang 解析、生成json的资料请关注其它相关文章!

您可能感兴趣的文章:
  • Go语言实现JSON解析的方法详解
  • go语言通过结构体生成json示例解析
  • Django后端接收嵌套Json数据及解析详解
  • 使用Go语言解析动态JSON格式的方法
  • 利用Golang解析json数据的方法示例
  • Go语言利用Unmarshal解析json字符串的实现

今天关于浅谈使用java解析和生成JSONjava 生成json的分享就到这里,希望大家有所收获,若想了解更多关于2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码、C# 中 Json 解析和生成、Go Web编程--解析JSON请求和生成JSON响应、Golang 如何解析和生成json等相关知识,可以在本站进行查询。

本文标签: